我有一个listwidget和一个treewidget . 我希望listwidgetitems能够通过拖放移动到listwidget内部,我还希望listwidget接受来自treewidget的拖动项目的丢弃,但是,在此之前,我想对数据进行一些处理 .
我现在可以做所有这些事情,但是我无法找到如何从treewidget开始将自定义数据设置为拖动事件 .
例如,我的treewidget中有一个topLevelItem,文本“Add DrawEffect”和QIcon,当我拖放到listwidget中时,我想向listwidget添加一个新项目,说:
DrawEffect 0x0x0x0 effect-here
并不是
Add DrawEffect (showing its QIcon as well)
我什么时候应该设置这些数据?
到目前为止,这是我的代码,在listwidget中拖放listwidgetitems时工作完全正常,它适用于在listwidget中拖放qtreewidgetitems,但它会按原样复制它们,而我想在添加它们之前进行进一步处理:
在我的treewidget的构造函数中:
this->setDragDropMode(QAbstractItemView::DragOnly);
this->setDefaultDropAction(Qt::CopyAction);
在我的listwidget的构造函数中:
this->setAcceptDrops(true);
this->setDragDropMode(QAbstractItemView::DragDrop);
this->setDefaultDropAction(Qt::MoveAction);
重新实现listwidget的dropEvent:
if(event->source()->inherits("QTreeWidget"))
qDebug() << "The dragged item comes from the TreeWidget.";
else
qDebug() << "The dragged item comes from the ListWidget itself.";
QListWidget::dropEvent(event);
如你所见,我可以区分treewidget和listwidget项目,但我不知道在此之后该怎么做......
我想像这样的东西就可以了:
if(event->source()->inherits("QTreeWidget")){
//treewidget item, it needs further processing
}
else
QListWidget::dropEvent(event); //listwidget item, no further processing needed
谢谢 :/
2 回答
AFAIK拖拽操作不是'contain'项目,它只包含描述它的数据 . 因此,您需要根据
event->mimeData()
对象中的文本,图标等数据创建一个新项目,并手动将其插入到event->pos()
的窗口小部件中 .要回答,正如cmannett85所说,进入拖动时,会自动将mime数据添加到拖动事件中 . 您可以通过覆盖QTableWidget :: mimeData()来覆盖添加的mimedata . 在此方法中,您可以为该位置的项目设置一些标识符(例如:行号,列号,索引到某个数据结构)
然后,覆盖列表小部件中的dropMimedata方法以读取您添加的此数据并执行插入操作
有关更多详细信息,请参阅When dragging a row in a QTableWidget, how can I find out what row index it was dragged FROM and TO?