如何在事件中为拖放设置自定义数据?

时间:2012-09-12 23:37:23

标签: qt drag-and-drop qlistwidget qtreewidget

我有一个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

谢谢:/

2 个答案:

答案 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()的小部件中。