Qt在两个QListWidget之间拖放

gay*_*mer 11 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);
Run Code Online (Sandbox Code Playgroud)

我不得不把它list2打开,InternalMove否则当我把它拖到它时,项目不会删除list1.

如果我把list1InternalMove我不能删除任何更多的就可以了.

我是否必须编写自己的拖放功能才能执行此操作?

Pio*_*ost 12

您可以扩展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
Run Code Online (Sandbox Code Playgroud)

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