C++ 使QTreeWidget项在拖放时展开

C++ 使QTreeWidget项在拖放时展开,c++,qt,qtreewidget,C++,Qt,Qtreewidget,我试图找到一种方法,在不重新实现拖放的情况下,当一个项目被拖放到树项目中时,树项目会展开。我已经研究了在顶级addItem上扩展所有内容以及过度编写dropEvent。addItem方法不起作用(假设这是因为本机拖放实现没有使用addItem),dropEvent带来了许多问题,特别是mimeData不适合,给了我一个回到树的钩子。我是Qt新手,所以我可能遗漏了一些简单的东西 欢迎采取任何其他办法 编辑: 利用@G.M.提供的信息,我重新尝试覆盖dropEvent void ScenarioTr

我试图找到一种方法,在不重新实现拖放的情况下,当一个项目被拖放到树项目中时,树项目会展开。我已经研究了在顶级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);
}
或者(更简洁一点)


你的意思是拖动时展开吗?不,我的意思是,如果我将A拖动到B中,我希望B展开,以便我可以看到A被放置在其中。我不确定我是否理解你关于
dropEvent
的评论
qdropent::pos
提供放置位置。可以映射并用作
QTreeView::indexAt
的参数。一旦你拥有了
QModelIndex
你就可以展开/折叠它,或者用它做任何你想做的事情。感谢你给我指明了正确的方向,我错过了QDropEvent::pos,尽管dropEvent仍然存在一些持久的问题。我已经更新了我的问题以反映新的信息。您正在使用
this->itemAt(modeleindex.row(),modeleindex.column())
。我想你真正想要的是或。
void ScenarioTreeWidget::MyTreeWidget::dropEvent (QDropEvent *event)
{
  QTreeWidgetItem* item = this->itemAt(event->pos());
  this->expandItem(item);
  QWidget::dropEvent(event);
}