Qt:QAbstractItemModel::beginInsertRows/endInsertRows 后视图未更新
Qt: View not updating after QAbstractItemModel::beginInsertRows/endInsertRows
我有一个 QAbstractItemModel
派生模型附加到 QTreeView
我想以编程方式将单行附加到树层次结构中某处的节点。
我有一个连接到信号的插槽。该信号发送我要将新行附加到的节点的 QModelIndex
。在插槽中,我调用 beginInsertRows(...)
使用 QModelIndex
和 新行的行号 ,将新行附加到我的模型数据,然后调用 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 个子行:
- 0:
inst_id
- 1:
LEG_1
- 2:
LEG_2
- 3:
LEG_3
- 因此,新行的行索引为 4,所以我调用
beginInsertRows(SPREAD_1, 4, 4);
我就是这样做的,我的视图没有显示我的新行。
证明节点确实存在:
我知道我的模型中存在该行,因为如果我 折叠 SPREAD_1
节点,然后 重新展开它,我新添加的行现在可见:
问题:
AFAIKT 我已经正确地遵循了 example online,但我显然遗漏了一些东西。
如何将新行附加到树节点并更新视图?
我是否需要发出信号或覆盖另一个基础 class 方法?
尝试以父索引作为参数发出 dataChanged 信号。
这样的问题表明模型中的其他地方存在错误。没有看到模型的实现,就不可能说出在哪里。
使用 Model Test 对诊断问题很有帮助。
从字面上看,您只需要用您的模型实例化一个 ModelTest
实例
QTreeView(&_model);
ModelTest test(&_model);
如果模型不符合,您将从 ModelTest
得到断言失败
我通过在插入行
之后添加 ui->treeView->reset();
来解决这个问题
确保传递给 beginInsertRows
的索引是正确的。特别是如果子项附加到零列(通常是),则索引的列号需要为零!
我有一个 QAbstractItemModel
派生模型附加到 QTreeView
我想以编程方式将单行附加到树层次结构中某处的节点。
我有一个连接到信号的插槽。该信号发送我要将新行附加到的节点的 QModelIndex
。在插槽中,我调用 beginInsertRows(...)
使用 QModelIndex
和 新行的行号 ,将新行附加到我的模型数据,然后调用 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 个子行:- 0:
inst_id
- 1:
LEG_1
- 2:
LEG_2
- 3:
LEG_3
- 0:
- 因此,新行的行索引为 4,所以我调用
beginInsertRows(SPREAD_1, 4, 4);
我就是这样做的,我的视图没有显示我的新行。
证明节点确实存在:
我知道我的模型中存在该行,因为如果我 折叠 SPREAD_1
节点,然后 重新展开它,我新添加的行现在可见:
问题:
AFAIKT 我已经正确地遵循了 example online,但我显然遗漏了一些东西。
如何将新行附加到树节点并更新视图?
我是否需要发出信号或覆盖另一个基础 class 方法?
尝试以父索引作为参数发出 dataChanged 信号。
这样的问题表明模型中的其他地方存在错误。没有看到模型的实现,就不可能说出在哪里。
使用 Model Test 对诊断问题很有帮助。
从字面上看,您只需要用您的模型实例化一个 ModelTest
实例
QTreeView(&_model);
ModelTest test(&_model);
如果模型不符合,您将从 ModelTest
我通过在插入行
之后添加ui->treeView->reset();
来解决这个问题
确保传递给 beginInsertRows
的索引是正确的。特别是如果子项附加到零列(通常是),则索引的列号需要为零!