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

Posted

技术标签:

【中文标题】使用自定义数据将 QTreeWidgetItem 拖放到 QGraphicsView【英文标题】:Drag and Drop QTreeWidgetItem to QGraphicsView with custom data 【发布时间】:2021-12-11 05:21:31 【问题描述】:

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

我想将QTreeWidgetItem 拖放到QGraphicsScene 中,以便在其中创建一个对象。该对象是一个矩形,其中包含QTreeWidgetItem 的文本。

我能够执行拖放操作,并且我有我的dropEvent 虚拟方法来处理它。它接收到 drop 事件,但我无法检索有关原始 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,而其他字符串为空。

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

【问题讨论】:

【参考方案1】:

模型的 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();
        
    

【讨论】:

谢谢,你拯救了我的一天!

以上是关于使用自定义数据将 QTreeWidgetItem 拖放到 QGraphicsView的主要内容,如果未能解决你的问题,请参考以下文章

QTreeWidgetItem 不显示默认三角形 && 自定义TreeWidgetItem的widget && 子项Item与顶层TopLevelItem顶端对其-

如何将 itemExpanded 与 QTreeWidgetItem 的子类一起使用

如何将 QTableWidget 添加到 QTreeWidget 但作为 QTreeWidgetItem

7.6.3 QTreeWidgetItem类函数介绍

仅使 QTreeWidgetItem 的一列可编辑

我在具有动态数据的 QtreeWidget 中的 QTreewidgetItem 中单击的编辑按钮