Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用新数据更新QTreeView不正确_C++_Qt_Treeview_Qtreeview - Fatal编程技术网

C++ 使用新数据更新QTreeView不正确

C++ 使用新数据更新QTreeView不正确,c++,qt,treeview,qtreeview,C++,Qt,Treeview,Qtreeview,从流行的Qt开始,我希望能够用新数据更新整个树视图。该示例仅在启动时填充树视图一次,之后不会更新树视图 我对示例进行了一些编辑(treeview现在在一个对话框中,因此我可以按“按钮”来更新treeview),当我更新树视图时,最顶端的树项成为每个最顶端树项的子树项。在这种情况下,当我更新树视图时,前后应该是相同的,因为它是相同的数据,我不明白为什么前后会不同。下面的屏幕截图更好地说明了问题: 更新前 更新后,您可以在下面看到,如果我单击一个多次使用的项目,它们都会高亮显示,这很有意义,因为它

从流行的Qt开始,我希望能够用新数据更新整个树视图。该示例仅在启动时填充树视图一次,之后不会更新树视图

我对示例进行了一些编辑(treeview现在在一个对话框中,因此我可以按“按钮”来更新treeview),当我更新树视图时,最顶端的树项成为每个最顶端树项的子树项。在这种情况下,当我更新树视图时,前后应该是相同的,因为它是相同的数据,我不明白为什么前后会不同。下面的屏幕截图更好地说明了问题:

更新前

更新后,您可以在下面看到,如果我单击一个多次使用的项目,它们都会高亮显示,这很有意义,因为它们都(可能)指向同一个项目(我不确定如何)

我对SimpleTreeModel的编辑如下:

main.cpp

#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();
}