我遵循Qt指南来实现自定义QAbstractTableModel;也就是说,我实现了虚函数insertRows。此函数的声明不采用任何自定义数据结构。因此,该函数只使用默认构造函数来创建我的数据结构。
如果我要插入现有的自定义对象怎么办?因为我看不到在insertRows中插入已经存在的对象(由于它的函数签名),我觉得强制实现默认构造函数,调用insertRows插入一个空对象,然后调用setData来替换已经存在的空对象现有的对象。
我这样做错了吗?还有更好的方法吗?
答案 0 :(得分:1)
如果您的数据项是使用pimpl idiom实现的,默认构造可能是一项简单的操作 - 您只需将d指针设置为零。
如果您使用QVariant
进行内部存储,则可以默认构造null变体,而不是默认构建对象。
您可以完全自由地为您的模型实施其他方法,以便您更轻松地使用。 Qt捆绑的视图当然不会使用这些方法。这对于插入来说不是什么大问题,因为Qt提供的视图的 none 自己插入数据。这些视图中几乎没有代码可以插入任何数据。数据插入必须单独实现,数据直接插入模型中。当然,视图会收到有关此类更改的通知。如果您希望模型与不受您控制的代码互操作,或者您希望避免团队项目中的其他人出现意外,则需要处理insertRows
。
Qt有几个观点,其中一些来自QAbstractItemView。没关系强迫您将视图实现为QAbstractItemView的子类,请注意。 Qt甚至提供了一个这样的视图适配器--QDataWidgetMapper。它就像一个视图,但不是从QAbstractItemView派生的。