将项目添加到根目录时,QTreeview无法正确更新

时间:2014-04-29 12:06:39

标签: treeview qt4 qtreeview

我有一个树视图,它应该显示自己的数据收集的内容来实现这一点,我已经为树视图实现了一个新模型。当我将一个对象添加到任何父项时,一切正常,新项目显示在视图中,但是当我尝试将项目添加到rootitem时,直到我将一个Object添加到另一个parentitem或者我才会显示此项目重置模型。

我向模型添加行的方法如下所示:

bool TreeModel::insertRows(int row, int count, const QModelIndex &parent, DataObject *object, QString name, QString path)
{
  if (!parent.isValid())
     return false;

  DataCollection* dataCollection = static_cast<DataCollection*>(parent.internalPointer());

  beginInsertRows(parent, dataCollection->Size(), dataCollection->Size());
  dataCollection->AddData(object, name.toStdString(), path.toStdString());
  endInsertRows();


  return true;
}

在向rootelement添加项目时,如何更新视图?

2 个答案:

答案 0 :(得分:1)

你没有以良好的方式使用beginInsertRows:

void QAbstractItemModel::beginInsertRows(const QModelIndex & parent, int first, int last)

但是你传递的物品大小是两倍:这对我来说似乎很奇怪。无论如何,如果你的模型是QStandardItemModel的子类(而不是QAbstractItemModel),那么你可以使用一个非常方便的方法:

QStandardItem * QStandardItemModel::invisibleRootItem() const

来自文档:

  

返回模型的隐形根项。   隐藏的根项目通过QStandardItem API提供对模型的顶级项目的访问,从而可以编写可以统一处理顶级项目及其子项的函数;例如,涉及树模型的递归函数。

     

注意:对从此函数检索到的QStandardItem对象调用index()无效。

答案 1 :(得分:-1)

我找到了解决这个问题的简单方法 - 您只需添加即可 您的insertRows()函数emit layoutChanged();

最初我发出了dataChanged(),但显然它只影响项目的数据,分支相关的数据不属于项目。

它不如使用beginInsertRows()和endInsertRows()正确地执行它,但如果你拥有的项目数量不是很大,那么这个解决方案应该足够了。