我有一个QAbstractItemModel
派生的模型附加到QTreeView
我想以编程方式将一行附加到我的树层次结构中的某个节点。
我有一个插槽,它连接到我视图中的信号。信号发送我想要追加新行的节点的QModelIndex
。在插槽中,我使用beginInsertRows(...)
和新行的行号来调用QModelIndex
,将新行追加到我的模型数据中,然后调用endInsertRows()
:< / p>
传递给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个子行:
inst_id
LEG_1
LEG_2
LEG_3
beginInsertRows(SPREAD_1, 4, 4);
我这样做,我的观点没有显示我的新行。
我知道我的模型中存在该行,因为如果我崩溃 SPREAD_1
节点,然后重新展开,我新添加的行就是现在可见:
AFAIKT我已正确关注example online,但我显然错过了一些东西。
如何将新行附加到树节点,并让视图更新?
我是否需要发出信号或覆盖其他基类方法?
答案 0 :(得分:2)
这样的问题表明模型中的其他地方存在错误。没有看到模型的实现,就不可能说出来。
使用Model Test对诊断问题非常有帮助。
您需要的只是用您的模型实例化ModelTest
实例
QTreeView(&_model);
ModelTest test(&_model);
如果模型不符合,您将从ModelTest
答案 1 :(得分:0)
我通过在插入行
之后添加ui->treeView->reset();
来修复此问题
答案 2 :(得分:0)
确保传递给beginInsertRows
的索引正确。如果子级附加到零列(通常是零列),则特别是索引的列号必须为零!
答案 3 :(得分:-2)
尝试以父索引作为参数发出dataChanged信号。