3

与此问题相关的源代码可在我的 BitBucket 上的公共 Git 存储库中找到。

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

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刷新。

我知道这是通过 emitting 完成的dataChanged(),但不确定如何执行此操作。信号的信号签名dataChanged如下所示:

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

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

另外,beginInsertRows()endInsertRows()应该在哪里调用这些函数?

4

2 回答 2

4

来自 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.

其他受保护的功能说类似的话。

insertRows() 说:

如果你实现了自己的模型,如果你想支持插入,你可以重新实现这个函数。或者,您可以提供自己的 API 来更改数据。无论哪种情况,您都需要调用 beginInsertRows() 和 endInsertRows() 来通知其他组件模型已更改。

查看 QAbstractItemModel受保护的函数信号

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

连接到此信号的组件使用它来适应模型尺寸的变化。它只能由 QAbstractItemModel 实现发出,不能在子类代码中显式发出。

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

编辑以回答您的评论:

事实上,Items 应该有一个对模型的引用并告诉它变化,检查来自 QStandardItem 的这些行:

无效 QStandardItem::emitDataChanged()

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

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

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

于 2013-05-14T13:41:53.317 回答
1

还有一种不太合适但更简单的方法来实现这一点 -emit layoutChanged()而不是dataChanged(). 更多信息 - https://stackoverflow.com/a/41536459/635693

于 2017-01-08T18:53:00.653 回答