我遵循Qt准则来实现自定义QAbstractTableModel。也就是说,我实现了虚函数insertRows。此函数的声明不采用任何自定义数据结构。因此,该函数仅使用默认构造函数创建我的数据结构。
如果我有一个要插入的现有自定义对象怎么办?由于我看不到在insertRows中插入已经存在的对象的方法(由于其功能签名),因此我被迫实现一个默认构造函数,调用insertRows插入一个空对象,然后调用setData将空对象替换为已经存在的对象现有对象。
我做错了吗?有没有更好的办法?
如果您的数据项是使用pimpl惯用语实现的,则默认构造可能是微不足道的操作-您只需将d指针设置为零即可。
如果要QVariant
用于内部存储,则可以默认构造一个null变量,而不是默认构造您的对象。
您可以完全自由地为模型实现其他方法,以使其更易于使用。Qt捆绑视图当然不会使用此类方法。对于插入来说,这并不是什么大问题,因为Qt提供的视图都不是自己插入数据的。这些视图中实际上没有代码可以进行任何数据插入。数据插入必须单独实现,并将数据直接插入模型中。当然,视图会收到有关此类更改的通知。您需要处理insertRows
,如果你打算你的模型进行互操作的代码不是你的控制之下,或者如果你想避免意外给他人一个团队项目。
Qt附带了一些视图,其中一些来自QAbstractItemView。请注意,没有什么可以迫使您将视图实现为QAbstractItemView的子类。Qt甚至提供了一个这样的视图适配器-QDataWidgetMapper。它的作用类似于视图,但不是从QAbstractItemView派生的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句