我有一个listwidget和一个treewidget。 我希望listwidgetitems能够通过拖放在listwidget内部移动,我还希望listwidget接受来自treewidget的拖动项目的丢弃,但是,在此之前,我想对数据进行一些处理。 / p>
我现在可以做所有这些事情,但是我无法找到如何从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
谢谢:/
答案 0 :(得分:4)
要回答,正如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?
答案 1 :(得分:1)
AFAIK拖拽操作不包含该项目,它只包含描述它的数据。因此,您需要根据event->mimeData()
对象中的文本,图标等数据创建一个新项目,然后手动将其插入到event->pos()
的小部件中。