QTreeView & QAbstractItemModel & insertRow

Posted

技术标签:

【中文标题】QTreeView & QAbstractItemModel & insertRow【英文标题】: 【发布时间】:2011-09-29 00:18:42 【问题描述】:

我正在尝试为 QTreeView 实现 QAbstractItemModel。我在插入行时遇到问题。 我注意到,如果我在应用程序的开头插入,一切正常。但是如果我稍后插入行 - 在一些其他操作(如选择等)之后,新项目保持不可见。此外,QTreeView 似乎根本不起作用!我是否必须发出一些信号来通知 QTreeView 关于行插入?

这是我的插入方法:

bool LayersModel::insertRows(int position, int count, const QModelIndex  & parent)

    LayersModelItem * parentItem = getItem(parent);
    if (position > parentItem->childCount())
        return false;
    beginInsertRows(parent,position,position+count-1);
    bool result = true;
    for (;count;--count)
        result &= parentItem->insertChildren(position, new LayersModelItem());
    endInsertRows();
    return result;

LayersModelItem 是具有 QList 及其子级和数据的类。

我的项目的完整代码(需要 KDE 库)在这里: https://github.com/coder89/PhotoFramesEditor/tree/v0.0.8 要查看问题,请在主窗口中选择一个蓝色项目,然后右键单击它并选择“删除项目”。 (这个方法在 Canvas::removeItems() 中)并且它被完整地评论了 - 我很绝望,我试图找到这个问题的原因......(实际上它没有删除任何东西 - 它添加了新项目)。

感谢您的帮助和建议!

【问题讨论】:

【参考方案1】:

只是一个快速的猜测,QAbstractItemModel 的 QT 文档说...

模型发出信号以指示 变化。例如,dataChanged() 是 每当生成数据项时发出 可用的模型被改变。 对提供的标题的更改 模型导致 headerDataChanged() 为 发出。 如果结构 基础数据变化,模型可以 发出 *layoutChanged() 以指示 他们应该的任何附加视图 重新显示任何显示的项目,采取 考虑到新结构*。

所以我想,您需要从模型中发出 layoutChanged() 信号(每当您更改模型中的数据时)才能更新连接的视图。

还阅读了模型视图架构的 QT 文档,它是如何在 QT 中实现的

看看是否有帮助,如果没有,我会尝试下载您的代码并对其进行调试,看看有什么问题。 祝你好运

【讨论】:

以上是关于QTreeView & QAbstractItemModel & insertRow的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QAbstractItemModel 中为 QTreeView 创建人工节点

连接:没有这样的插槽 QTreeView

`QTreeView` 何时在 Mac 上发出激活信号?

Qt QTreeView - 当条件不满足时恢复到以前的选择

QTreeView

右键单击 QTreeView 内的 QHeaderView