Qt:在QAbstractItemModel :: beginInsertRows / endInsertRows

时间:2015-09-30 22:07:52

标签: c++ qt qtreeview qabstractitemmodel

我有一个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()后,我的观点无法更新。

实施例

以下是我的树视图示例。

enter image description here

情景:

  • 我想在 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节点,然后重新展开,我新添加的行就是现在可见:

enter image description here

问题:

AFAIKT我已正确关注example online,但我显然错过了一些东西。

如何将新行附加到树节点,并让视图更新?

我是否需要发出信号或覆盖其他基类方法?

4 个答案:

答案 0 :(得分:2)

这样的问题表明模型中的其他地方存在错误。没有看到模型的实现,就不可能说出来。

使用Model Test对诊断问题非常有帮助。

您需要的只是用您的模型实例化ModelTest实例

QTreeView(&_model);
ModelTest test(&_model);

如果模型不符合,您将从ModelTest

获得断言失败

答案 1 :(得分:0)

我通过在插入行

之后添加ui->treeView->reset();来修复此问题

答案 2 :(得分:0)

确保传递给beginInsertRows的索引正确。如果子级附加到零列(通常是零列),则特别是索引的列号必须为零!

答案 3 :(得分:-2)

尝试以父索引作为参数发出dataChanged信号。