我有两个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
,我就不能再放弃它了。
我是否必须编写自己的拖放功能才能做到这一点?
答案 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
),您必须输入新标题文件的名称,您的类将被声明(您可以将上面的代码复制并粘贴到此文件中) )。