使用自定义数据将 QTreeWidgetItem 拖放到 QGraphicsView

Drag and Drop QTreeWidgetItem to QGraphicsView with custom data

我有一个 class 包含一个 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 subclass 中的 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,而其他字符串为空。

如何检索已拖入 QGraphicsSceneQTreeWidgetItem 的相关信息?

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

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();
        }
    }
}