将QTreeWidgetItem拖放到带有自定义数据的QGraphicsView中



我有一个包含QTreeWidget的类,其中我有一些QTreeWidgetItem

我想把QTreeWidgetItem拖放到QGraphicsScene中,以便在那里创建一个对象。对象是一个矩形,里面有QTreeWidgetItem的文本。

我能够执行拖放操作,并且我有我的dropEvent虚拟方法来处理它。它接收到删除事件,但是我无法检索到关于原始QTreeWidgetItem的信息。

这是我用来初始化QTreeWidget的代码:

m_nodeList = new QTreeWidget(this);
m_nodeList->setColumnCount(2);
m_nodeList->setHeaderLabels({ NameLabel, CategoryLabel });
m_nodeList->setDragEnabled(true);
m_nodeList->setDragDropMode(QAbstractItemView::DragOnly);

QGraphicsSceneScene子类中dropEvent覆盖的方法如下:

void Scene::dropEvent(QGraphicsSceneDragDropEvent* event) {
event->acceptProposedAction();
for (const auto& it : event->mimeData()->formats()) {
std::string f = it.toStdString();
int i = 0;
}
std::string t = event->mimeData()->text().toStdString();
std::string on = event->mimeData()->objectName().toStdString();
}

f包含application/x-qabstractitemmodeldatalist,其他字符串为空。

我如何检索关于我拖到QGraphicsScene中的QTreeWidgetItem的信息?

模型的DND使用内部Qt格式,因此一个可能的解决方案是使用dummymodel:

void Scene::dropEvent(QGraphicsSceneDragDropEvent* event) {
event->acceptProposedAction();
if(event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")){
QStandarditemmodel dummy_model;
if(dummy_model.dropMimeData(event->mimeData(), event->dropAction(), 0, 0, QModelIndex()){
QModelIndex index = dummy_model.index(0, 0);
qDebug() << index.data();
}
}
}