我有一个树视图,它应该显示自己的数据收集的内容来实现这一点,我已经为树视图实现了一个新模型。当我将一个对象添加到任何父项时,一切正常,新项目显示在视图中,但是当我尝试将项目添加到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添加项目时,如何更新视图?
答案 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()正确地执行它,但如果你拥有的项目数量不是很大,那么这个解决方案应该足够了。