首页 文章

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

提问于
浏览
1

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

  • 1

    AFAIK拖拽操作不是'contain'项目,它只包含描述它的数据 . 因此,您需要根据 event->mimeData() 对象中的文本,图标等数据创建一个新项目,并手动将其插入到 event->pos() 的窗口小部件中 .

  • 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?

相关问题