Qt在两个QListWidget之间拖放

时间:2011-01-04 08:55:58

标签: qt drag-and-drop qlistwidget

我有两个QListWidget(list1和list2)

  • list1应该能够接收来自list2
  • 的内容
  • list1应该能够通过内部拖放进行重组
  • list2应该能够接收来自list1
  • 的内容

list1->setSelectionMode(QAbstractItemView::SingleSelection);
list1->setDragEnabled(true);
list1->setDragDropMode(QAbstractItemView::DragDrop);
list1->viewport()->setAcceptDrops(true);
list1->setDropIndicatorShown(true);

ulist2->setSelectionMode(QAbstractItemView::SingleSelection);
list2->setDragEnabled(true);
list2->setDragDropMode(QAbstractItemView::InternalMove);
list2->viewport()->setAcceptDrops(true);
list2->setDropIndicatorShown(true);

我必须将list2放在InternalMove上,否则当我将其拖到list1时,该项目就不会删除。

如果我将list1添加到InternalMove,我就不能再放弃它了。

我是否必须编写自己的拖放功能才能做到这一点?

1 个答案:

答案 0 :(得分:11)

您可以扩展QListWidget覆盖dragMoveEvent方法,如下所示

#ifndef MYLISTWIDGET_HPP
#define MYLISTWIDGET_HPP

#include <QListWidget>

class MyListWidget : public QListWidget {

public:
    MyListWidget(QWidget * parent) :
        QListWidget(parent) {}

protected:
    void dragMoveEvent(QDragMoveEvent *e) {
        if (e->source() != this) {
            e->accept();
        } else {
            e->ignore();
        }
    }
};

#endif // MYLISTWIDGET_HPP

在我们的实现中,我们检查了拖动事件的来源,我们不接受(允许)删除来自我们的小部件本身的项目。
如果您正在使用QtDesigner,则可以在右键单击表单上的QListWidget时从上下文菜单中使用提升为... 选项。您必须输入新类的名称(在我的示例中为MyListWidget),您必须输入新标题文件的名称,您的类将被声明(您可以将上面的代码复制并粘贴到此文件中) )。