使 QTreeWidget 项目在拖放时展开

make QTreeWidget items expand on drag and drop

我正在尝试找到一种方法,无需重新实现拖放,当将项目放入其中时,树项目就会展开。我研究了在顶层 addItem 上展开所有内容以及覆盖了 dropEvent。 addItem 方法不起作用(假设这是因为 addItem 未被本机拖放实现使用)并且 dropEvent 提出了许多问题,特别是 mimeData 不适合并让我回到树中。我是 Qt 的新手,所以我可能遗漏了一些简单的东西。

欢迎任何其他方法。

编辑: 处理@G.M 提供的信息。我已经回去尝试覆盖 dropEvent。

void ScenarioTreeWidget::MyTreeWidget::dropEvent(QDropEvent *event)
{
    QModelIndex modelIndex = this->indexAt(event->pos());
    QTreeWidgetItem* item = this->itemAt(modelIndex.row(), modelIndex.column());
    this->expandItem(item);
    QWidget::dropEvent(event);
}

两个问题,正在展开的项目是被拖动的项目,而不是它被拖放到的项目(不知道这是因为索引是被拖动项目的索引还是我有错误在我的代码中)。此外,我仍然失去了默认的 dropEvent 行为(当我使用此代码拖放时,所有项目都保持在拖放之前的位置)。

您正在将 QModelIndex 行和列传递给 QTreeWidget::itemAt,但它 实际上 想要的是小部件相对 x 和 y 坐标。

根据您提供的信息,我认为您需要的是...

void ScenarioTreeWidget::MyTreeWidget::dropEvent (QDropEvent *event)
{
  QModelIndex modelIndex = this->indexAt(event->pos());
  QTreeWidgetItem* item = this->itemAt(modelIndex);
  this->expandItem(item);
  QWidget::dropEvent(event);
}

或者(更简洁一点)...

void ScenarioTreeWidget::MyTreeWidget::dropEvent (QDropEvent *event)
{
  QTreeWidgetItem* item = this->itemAt(event->pos());
  this->expandItem(item);
  QWidget::dropEvent(event);
}