使QTreeWidget项目在拖放时展开

时间:2016-08-31 16:40:30

标签: c++ qt qtreewidget

我正在尝试找到一种方法,在不重新实施拖放的情况下,在项目被放入其中时展开树项目。我已经研究了在顶级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行为(当我使用此代码拖放时,所有项目都停留在拖放之前的位置)。

1 个答案:

答案 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);
}