QTreeView& QAbstractItemModel&的insertRow

时间:2011-07-05 17:26:05

标签: qt insertion qtreeview qabstractitemmodel

我正在尝试为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 个答案:

答案 0 :(得分:11)

只是一个快速的猜测,QA抽象问题模型的QT Doc说...

  

模型发出信号指示   变化。例如,dataChanged()是   每当数据项发出时都会发出   由模型提供的更改。   对标题提供的标题的更改   model原因是headerDataChanged()   发射。 如果结构了   基础数据变化,模型可以   发出* layoutChanged() 以指示   任何附加的观点,他们应该   重新显示所显示的任何项目,采取   考虑新结构 *。

所以我想,您需要从模型中发出layoutChanged()信号(无论何时更改模型中的数据),以便更新连接的视图。

另请阅读模型视图架构的QT文档,以及如何在QT中实现

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