我正在实现我的第3个“天真”模型,因为QAbstractItemModel继承了类。
到目前为止它运作良好。
但是,我一直在视图中使用只读“静态”模型,并且仅根据用户的操作更改了某些视图的模型。所以我使用my_view->setModel( a_model );
来更新视图。
现在我需要有一个视图来保持一个独特的模型,但有时需要更新该模型,使用一个特殊的函数“update()”函数,我需要在代码中调用它。
在update()函数结束时,我只需使用相应的数据调用emit dataChanged( ... );
。
似乎它不会更新此模型所连接的视图。进行视图更新的唯一方法似乎是再次执行my_view->setModel( nullptr );
然后my_view->setModel( a_model );
。
emit dataChanged( ... );
无法触发视图的显示更新的可能原因是什么?
我一直在调试我的模型实现函数,并且调用了index()函数,但没有调用data()。我有点担心,在更改模型的情况下,我可能没有理解模型/视图系统(通过视图而不是通过编程方式进行更改)。
这是一个开源项目,所以你在那里检查完整的模型代码(我认为它有点hacky,不习惯模型/查看Qt的系统):http://code.google.com/p/art-of-sequence/source/browse/tools/aosdesigner/view/model/LayerObjectsModel.cpp?spec=svn4fe209aa3e82f2c7cd42192581a890e28bada9b0&r=4fe209aa3e82f2c7cd42192581a890e28bada9b0 管理视图的窗口小部件的代码可在那里找到:http://code.google.com/p/art-of-sequence/source/browse/tools/aosdesigner/view/LayersView.cpp?spec=svn4fe209aa3e82f2c7cd42192581a890e28bada9b0&r=4fe209aa3e82f2c7cd42192581a890e28bada9b0
答案 0 :(得分:4)
我查了一下Qt文档。当模型的现有数据发生变化时,应发出dataChanged()
。
如果要向模型中添加行,请选中beginInsertRows和endInsertRows
来自insertRows Qt文档:
如果您实施自己的模型,则可以重新实现此功能 你想支持插入。或者,您可以提供 自己的API用于更改数据。在任何一种情况下,您都需要打电话 beginInsertRows()和endInsertRows()通知其他组件 模特已经改变了。
如果要从模型中删除行,请相应地检查beginRemoveRows和endRemoveRows
另请查看beginResetData
当模型从根本上改变其数据时,有时可能更容易 只需调用此函数而不是发出dataChanged()来通知其他函数 基础数据源或其结构具有的组件 改变。