[英]QAbstractItemModel::endInsertRows: Invalid index run time error
[英]Qt: View not updating after QAbstractItemModel::beginInsertRows/endInsertRows
我有一个QAbstractItemModel
派生模型附加到QTreeView
我想以编程方式将一行附加到我的树层次结构中某处的节点。
从我的角度来看,我有一个连接到信号的插槽。 该信号发送我想要添加新行的节点的QModelIndex
。 在插槽中,我使用QModelIndex
和新行的行号调用beginInsertRows(...)
,将新行附加到我的模型数据,然后调用endInsertRows()
:
传递给beginInsertRows(...)
的值是父节点在追加新节点之前的子行数。
也就是说,如果有 4 个子行,它们的行索引为 0、1、2 和 3。因此添加的新行号将为 4。
void Model::slotOnAddRow(QModelIndex parent, std::string key)
{
assert(parent.isValid());
Row& parent_row = *static_cast<Row*>(parent.internalPointer());
beginInsertRows(parent, parent_row.numChildren(), parent_row.numChildren());
parent_row.addChildRow(key);
endInsertRows();
}
我遇到的问题是在调用endInsertRows()
我的视图没有更新。
这是我的树视图的示例。
SPREAD_1
追加一个新行。SPREAD_1
目前有 4 SPREAD_1
行:
inst_id
LEG_1
LEG_2
LEG_3
beginInsertRows(SPREAD_1, 4, 4);
我就是这样做的,我的视图没有显示我的新行。
我知道我的模型中存在该行,因为如果我折叠SPREAD_1
节点,然后重新展开它,我新添加的行现在可见:
AFAIKT 我已经正确地遵循了在线示例,但显然我遗漏了一些东西。
如何将新行附加到树节点,并更新视图?
我是否需要发出信号或覆盖另一个基类方法?
像这样的问题表明模型中的其他地方存在错误。 如果没有看到模型的实现,就不可能说在哪里。
使用模型测试对诊断问题非常有帮助。
从字面上看,您只需要使用您的模型实例化一个ModelTest
实例
QTreeView(&_model);
ModelTest test(&_model);
如果模型不符合,您将从ModelTest
得到断言失败
我通过添加ui->treeView->reset();
解决了这个问题ui->treeView->reset();
插入行后
确保传递给beginInsertRows
的索引是正确的。 特别是,如果子项附加到第 0 列(它们通常是),则索引的列号需要为零!
尝试以父索引作为参数发出dataChanged信号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.