c++ - Qt:QAbstractItemModel::beginInsertRows/endInsertRows 后 View 未更新

标签 c++ qt qtreeview qabstractitemmodel

我有一个 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() 后我的 View 没有更新。

示例:

这是我的 TreeView 示例。

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);

我这样做了,我的 View 没有显示我的新行。

证明节点确实存在:

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

enter image description here

问题:

AFAIKT 我关注了 example online正确,但我显然遗漏了一些东西。

如何将新行附加到树节点,并更新 View ?

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

最佳答案

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

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

从字面上看,您只需要用您的模型实例化一个 ModelTest 实例

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

如果模型不符合,您将从 ModelTest 获得断言失败

关于c++ - Qt:QAbstractItemModel::beginInsertRows/endInsertRows 后 View 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32876390/

相关文章:

c++ - y 轴的 QtCharts 自动范围

c++ - (long long)x 与 C++ 中的 (long long)floor(x) 相同吗?

使用文件指针的 C++ 位移位

c++ - 将 SDL 用于 Web 应用程序

c++ - 如何在一个 QTreeView 中组织 QStandardItemModel

c++ - 如何在 QAbstractItemModel 中设置 QCheckBox?

c++ - 检查 QTextStream::operator>> 是否失败

qt - 选项卡未激活时未定义的元素

c++ - QML多媒体播放文件夹中的所有mp3

c++ - QTreeView:如何中止选择更改