我试图实现QAbstractItemModel为QTreeView。我有插入行问题。我注意到,如果我在我的应用程序的开始插入一切工作正常。但是如果我稍后插入行-在一些其他操作(如选择等)之后,新项保持不可见。此外,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()),它是完全注释-我很绝望,我试图找到这个问题的原因…(事实上,它不是删除任何东西,而是添加新项目)。
感谢您的帮助&建议!
只是一个快速猜测,QAbstractItemModel的QT文档说…
模型发出信号表示的变化。例如,datachchanged()是每当生成数据项时发出可用的由模型更改。类提供的头文件的更改模型导致headerdatachchanged()为发出。底层数据发生变化时,模型可以emit *layoutChanged()表示to任何附加的观点,他们应该重新显示已显示的任何项,取新结构考虑*.
所以我猜,你需要发出layoutChanged()信号从你的模型(每当你改变模型中的数据),以更新连接的视图。
还可以阅读QT文档中的模型视图架构,它是如何在QT中实现的
看看是否有帮助,如果没有,我会尝试下载你的代码和调试它,看看,什么是错的。祝你好运