当然了Qt还提供了了一层数据缓存层QSortFilterProxyModel,这个类可以帮助我们更好的实现排序、模糊搜索功能
本篇文章这里只讲解重写数据源,关于其他两个类的重写前面文章中应该有所讲述,这里不再过多解释。
下面一起来看下数据源的重写方式,我们这里选择继承自QStandardItemModel这个类来实现我们的数据源,这里是一个偷懒的方式,正常情况下是需要重写QAbstractItemModel类,如果重写QAbstractItemModel类的话,那么就需要重写更多的接口。
class QRowModel : public QStandardItemModel { Q_OBJECT public: explicit QRowModel(QObject * parent = 0); ~QRowModel(); public: void SetSourceData(const TradeOrderInfoList & data); ... protected: virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; virtual void sort(int column, Qt::SortOrder order ) override; private: ... TradeOrderInfoList itemList; QColor m_CheckedColor = QColor("#4F4F4F"); mutable std::map <int, int> m_AlignmentList; friend class QRowTable; };
上次代码是重写Model类的头文件,其中有一些不相干的代码我选择了隐藏,重写Model最重要的就是需要我们自己去存储数据,并且在Qt的调用机制调用获取数据时给他返回即可。
关键点
- 重写Model,自己存储数据
- 重写data接口,返回数据
1、自己存储数据
自己存储数据有一个好处,那就是我们在给Model设置数据时,最大的性能损耗就是数据拷贝的过程,仔细想想这个是不是都不是问题。
上述代码中的TradeOrderInfoList这个接口提就是我们自己定义的一个容器接口,方便存储我们的表格数据,当视图绘制时,会从这里拿数据。
2、重写data接口
数据已经准备完毕,接下里就是View如何优雅的拿到数据并绘制了,这里我们重点讲述怎么拿数据,如何绘制是QStyledItemDelegate这个类的事,感兴趣的可以自己研究研究。
仔细查看Model的版主文档们就会发现有一个data接口函数,他的声明可能像下面这样
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const