【问题标题】:Qt: View not updating after QAbstractItemModel::beginInsertRows/endInsertRowsQt:在 QAbstractItemModel::beginInsertRows/endInsertRows 之后视图未更新
【发布时间】: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 个子行:
    • 0inst_id
    • 1LEG_1
    • 2LEG_2
    • 3LEG_3
  • 因此新行将有行索引4,所以我调用beginInsertRows(SPREAD_1, 4, 4);

我只是这样做,我的视图没有显示我的新行。

证明节点确实存在:

我知道该行存在于我的模型中,因为如果我折叠 SPREAD_1 节点,然后重新展开它,我新添加的行现在可见:

问题:

AFAIKT 我正确地遵循了example online,但我显然遗漏了一些东西。

如何将新行追加到树节点并更新视图?

我是否需要发出信号或重写另一个基类方法?

【问题讨论】:

    标签: c++ qt qtreeview qabstractitemmodel


    【解决方案1】:

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

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

    实际上,您只需要使用您的模型实例化一个 ModelTest 实例

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

    如果模型不符合,您将收到来自ModelTest 的断言失败

    【讨论】:

      【解决方案2】:

      我通过在插入行后添加 ui-&gt;treeView-&gt;reset(); 来解决此问题

      【讨论】:

        【解决方案3】:

        确保传递给beginInsertRows 的索引是正确的。特别是,如果子项附加到第 0 列(它们通常是),则索引的列号需要为零!

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 你能尝试实现insertRows方法吗?默认情况下它什么都不做并返回 false。
          猜你喜欢
          • 1970-01-01
          • 2021-12-26
          • 1970-01-01
          • 2015-10-16
          • 2011-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多