【发布时间】:2015-09-30 22:07:51
【问题描述】:
我有一个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 个子行:-
0:
inst_id -
1:
LEG_1 -
2:
LEG_2 -
3:
LEG_3
-
0:
- 因此新行将有行索引4,所以我调用
beginInsertRows(SPREAD_1, 4, 4);
我只是这样做,我的视图没有显示我的新行。
证明节点确实存在:
我知道该行存在于我的模型中,因为如果我折叠 SPREAD_1 节点,然后重新展开它,我新添加的行现在可见:
问题:
AFAIKT 我正确地遵循了example online,但我显然遗漏了一些东西。
如何将新行追加到树节点并更新视图?
我是否需要发出信号或重写另一个基类方法?
【问题讨论】:
标签: c++ qt qtreeview qabstractitemmodel