`emit dataChanged(...);`不触发视图显示更新的可能原因是什么?

时间:2011-10-31 19:21:02

标签: c++ qt

我正在实现我的第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

1 个答案:

答案 0 :(得分:4)

我查了一下Qt文档。当模型的现有数据发生变化时,应发出dataChanged()

如果要向模型中添加行,请选中beginInsertRowsendInsertRows

来自insertRows Qt文档:

  

如果您实施自己的模型,则可以重新实现此功能   你想支持插入。或者,您可以提供   自己的API用于更改数据。在任何一种情况下,您都需要打电话   beginInsertRows()和endInsertRows()通知其他组件   模特已经改变了。

如果要从模型中删除行,请相应地检查beginRemoveRowsendRemoveRows

另请查看beginResetData

  

当模型从根本上改变其数据时,有时可能更容易   只需调用此函数而不是发出dataChanged()来通知其他函数   基础数据源或其结构具有的组件   改变。