C++ 使用新数据更新QTreeView不正确
从流行的Qt开始,我希望能够用新数据更新整个树视图。该示例仅在启动时填充树视图一次,之后不会更新树视图 我对示例进行了一些编辑(treeview现在在一个对话框中,因此我可以按“按钮”来更新treeview),当我更新树视图时,最顶端的树项成为每个最顶端树项的子树项。在这种情况下,当我更新树视图时,前后应该是相同的,因为它是相同的数据,我不明白为什么前后会不同。下面的屏幕截图更好地说明了问题: 更新前 更新后,您可以在下面看到,如果我单击一个多次使用的项目,它们都会高亮显示,这很有意义,因为它们都(可能)指向同一个项目(我不确定如何) 我对SimpleTreeModel的编辑如下: main.cppC++ 使用新数据更新QTreeView不正确,c++,qt,treeview,qtreeview,C++,Qt,Treeview,Qtreeview,从流行的Qt开始,我希望能够用新数据更新整个树视图。该示例仅在启动时填充树视图一次,之后不会更新树视图 我对示例进行了一些编辑(treeview现在在一个对话框中,因此我可以按“按钮”来更新treeview),当我更新树视图时,最顶端的树项成为每个最顶端树项的子树项。在这种情况下,当我更新树视图时,前后应该是相同的,因为它是相同的数据,我不明白为什么前后会不同。下面的屏幕截图更好地说明了问题: 更新前 更新后,您可以在下面看到,如果我单击一个多次使用的项目,它们都会高亮显示,这很有意义,因为它
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(simpletreemodel);
QApplication app(argc, argv);
Dialog dialog;
dialog.show();
return app.exec();
}
treemodel.cpp(与下面的新函数完全相同)。我正在从rootItem中删除所有子项,以便在每次更新时都能将全新的数据放在一个文件上
TreeModel::TreeModel(const QString &data, QObject *parent)
: QAbstractItemModel(parent)
{
QList<QVariant> rootData;
this->data1 = data;
rootData << "Title" << "Summary";
rootItem = new TreeItem(rootData);
setupModelData(data.split(QString("\n")), rootItem);
}
void TreeModel::redrawAll() {
rootItem->removeChildren();
setupModelData(data1.split(QString("\n")), rootItem);
emit dataChanged(QModelIndex(), QModelIndex());
}
您发出的dataChanged()
信号毫无意义。不仅不允许使用无效的索引范围,而且dataChanged()
仅表示数据项的内容发生更改,而不是树的结构发生更改。你似乎也在改变结构
由于您似乎正在更改整个模型的内容,因此应指示您已重置模型:
void TreeModel::redrawAll() {
beginResetModel();
...
endResetModel();
}
我已经尝试过你的建议,它很有效(前后都一样),但是它关闭了treeview的所有分支。在我的实际项目中,我每秒更新很多次,所以在更新后扩展每一行是不可行的。在这个问题中,每次更新的结构都是相同的,只是内容在变化(在我的帖子中,每次更新的数据应该是相同的)。dataChanged的范围是从这里开始的(我在qt文档中没有找到任何关于这一点的信息),如果您保持模型的结构不变,那么您需要为树的每个非叶子分支发出
dataChanged
信号,并且这些信号中的每一个都应该覆盖该分支中的所有子级。这两个无效的索引不起作用-你已经知道了。我已经用一个新的TreeModel::redrawAll()
函数编辑了我的问题。但是,emit dataChanged(左上、右下)
给出的结果与emit dataChanged(QModelIndex()、QModelIndex())
相同。实际上,每个左上角和右下角的组合都会给出相同的结果,例如[(0,0),(1,1)];[ (0,0), (0,0) ]; [ (1,1), (1,1) ]; [ (0,0), (6,2) ];代码>(除了[(0,0),(0,0)];[(1,1),(1,1)];更新时间比其他代码长?)我不确定我做错了什么?
TreeModel::TreeModel(const QString &data, QObject *parent)
: QAbstractItemModel(parent)
{
QList<QVariant> rootData;
this->data1 = data;
rootData << "Title" << "Summary";
rootItem = new TreeItem(rootData);
setupModelData(data.split(QString("\n")), rootItem);
}
void TreeModel::redrawAll() {
rootItem->removeChildren();
setupModelData(data1.split(QString("\n")), rootItem);
emit dataChanged(QModelIndex(), QModelIndex());
}
void TreeModel::redrawAll() {
// beginResetModel();
rootItem->removeChildren();
QFile file(":/default.txt");
file.open(QIODevice::ReadOnly);
QString data = file.readAll();
setupModelData(data.split(QString("\n")), rootItem);
file.close();
// endResetModel();
// emit dataChanged(QModelIndex(), QModelIndex());
qDebug() << "TreeModel::redrawAll() " << rowCount() << columnCount();
// the output is TreeModel::redrawAll() 6 2
QModelIndex topLeft = this->index(0, 0);
QModelIndex bottomRight = this->index(rowCount(), columnCount());
emit dataChanged(topLeft, bottomRight);
}
void TreeModel::redrawAll() {
beginResetModel();
...
endResetModel();
}