gpt4 book ai didi

c++ - Qt QTreeView 添加到模型时不更新

转载 作者:太空狗 更新时间:2023-10-29 21:24:18 27 4
gpt4 key购买 nike

关于这个问题的源代码可以在我的public Git repository on BitBucket 上找到。 .

我正在尝试使用 mainwindow.cpp 中的以下代码将一些项目动态添加到 QTreeView 模型中:

if(dlg->exec() == QDialog::Accepted) {
QList<QVariant> qList;
qList << item.name << "1111 0000" << "0x00";
HidDescriptorTreeItem *item1 = new HidDescriptorTreeItem(qList, hidDescriptorTreeModel->root());
hidDescriptorTreeModel->root()->appendChild(item1);
}

这在我的 MainWindow 构造函数中运行时有效,就在 ui->setupUi(this) 之后,但我需要它从事件过滤器中运行,但相同的代码不会更新 QTreeView。当我在 mainwindow.cpp:70 设置断点并逐步执行接下来的几行时,我可以看到数据正在添加到模型中,但我需要 QTreeView刷新。

我知道这是通过发出 dataChanged() 来完成的,但不太确定该怎么做。 dataChanged 信号的信号签名如下所示:

void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>());

所以我需要想出 topLeftbottomRight QModelIndex 实例。如何从上面代码段中的 item1 构建/获取这些?

此外,beginInsertRows()endInsertRows() 在哪里出现,我应该调用这些函数吗?

最佳答案

来自 QAbstractItemModel 文档:

void QAbstractItemModel::beginInsertRows ( const QModelIndex & parent, int first, int last ) [protected]
Begins a row insertion operation.
When reimplementing insertRows() in a subclass, you must call this function before inserting data into the model's underlying data store.
The parent index corresponds to the parent into which the new rows are inserted; first and last are the row numbers that the new rows will have after they have been inserted.

其他 protected 函数也有类似的说法。

insertRows() 说:

If you implement your own model, you can reimplement this function if you want to support insertions. Alternatively, you can provide your own API for altering the data. In either case, you will need to call beginInsertRows() and endInsertRows() to notify other components that the model has changed.

看看 QAbstractItemModel protected functionssignals

View 连接到这些信号以了解模型数据何时更改并重新排列内部数据。这些函数会在内部发出信号,以便您可以轻松地在它发生时向 View 发出警告。但是信号只能由抽象类发出。

Components connected to this signal use it to adapt to changes in the model's dimensions. It can only be emitted by the QAbstractItemModel implementation, and cannot be explicitly emitted in subclass code.

所以你必须坚持这些方法。

编辑以回答您的评论:

确实,Items 应该有对模型的引用并告诉它有关更改的信息,请检查 QStandardItem 中的这些行:

void QStandardItem::emitDataChanged()

void QStandardItem::removeRows(int row, int count)

(注意,第二个,它如何调用模型的 rowsAboutToBeRemoved() 和 rowsRemoved() )

也许你应该尝试使用QStandardItemQStandardItemModel .直接或子类化。它会隐藏很多丑陋的东西。

关于c++ - Qt QTreeView 添加到模型时不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16530384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com