1

我有一个列表小部件和一个树小部件。我希望 listwidgetitems 能够通过拖放在 listwidget 内移动,并且我还希望 listwidget 接受从 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);

在我的列表小部件的构造函数中:

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

谢谢 :/

4

2 回答 2

4

回答一下,正如cmannett85所说,当进入drag时,会自动将mime数据添加到drag事件中。您可以通过覆盖 QTableWidget::mimeData() 来覆盖添加的 mimedata。在此方法中,您可以为该位置的项目设置一些标识符(例如:行号,列号,索引到某个数据结构)

然后,覆盖列表小部件中的 dropMimedata 方法以读取您添加的此数据并执行插入操作

看,当在 QTableWidget 中拖动一行时,我怎样才能找出它被拖动的 FROM 和 TO 的行索引?了解更多详情

于 2012-09-13T14:23:16.120 回答
1

AFAIK 拖动操作不“包含”该项目,它只包含描述它的数据。因此,您需要从event->mimeData()对象中的文本、图标等数据创建一个新项目,并将其手动插入到您的小部件中event->pos()

于 2012-09-13T07:40:11.730 回答