我正在尝试找到一种方法,在不重新实施拖放的情况下,在项目被放入其中时展开树项目。我已经研究了在顶级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行为(当我使用此代码拖放时,所有项目都停留在拖放之前的位置)。
答案 0 :(得分:1)
您已将QModelIndex
行和列传递给QTreeWidget::itemAt
,但实际上想要的是相对于x和y coords的小部件。
根据您提供的信息,我认为您需要的是......
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);
}