13

我有两个 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.

如果我投入list1InternalMove我就不能再放弃了。

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

4

1 回答 1

15

您可以扩展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在我的示例中),并且必须输入新头文件的名称,您的类将在其中声明(您可以将上面的代码复制并粘贴到此文件中)。

于 2011-01-04T21:29:32.540 回答