pose
SizeHintRole = 13, // 返回该列表项希望显示的大小(宽多少,高多少)
InitialSortOrderRole = 14, // 数据第一次呈现时用的排序方式(升序?降序?)
// 下面五个不知道是什么鬼
// Internal UiLib roles. Start worrying whe high. DisplayPropertyRole = 27, DecorationPropertyRole = 28, ToolTipPropertyRole = 29, StatusTipPropertyRole = 30, WhatsThisPropertyRole = 31, // Reserved,保留用来给开发者自定义角色。自定义角色从这个数值开始
UserRole = 0x0100
};
重写 data 方法实现了数据的只读模式,若数据支持编辑,必须重写 setData 方法,把内容写入原始数据。
如果要实现添加、删除数据项,还要重写以下方法:
6、insertRows:在行号为 row 处连续插入 count 行数据。
virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
7、removeRows:从行号为 row 处开始,连续删除 count 行。
virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
8、insertColumns:从列号为 column 处起,连接插入 count 列。
virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex());
9、removeColumns:从列号为 column 处开始,连续删除 count 列。
virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex());
===============================================================
下面咱们做一个简单的模型练练手。该模型的原始数据是一个整数列表(QList<int>)。先实现只读功能,即需要重写 parent、index、rowCount、columnCount 和 data 方法。头文件的声明如下:
#ifndef MODELS_H
#define MODELS_H
#include <QAbstractItemModel>
#include <QObject>
#include <QList>
class MyItemModel: public QAbstractItemModel
{
Q_OBJECT
public:
// 下面两个是构造函数
explicit MyItemModel(QObject* parent = nullptr);
explicit MyItemModel(const QList<int> &list, QObject* parent = nullptr);
// 返回父级
QModelIndex parent(const QModelIndex & child) const override;
// 返回索引
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
// 返回行数和列数
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
// 获取数据
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
// 下面这两个方法用来获取或设置数据源
QList<int> intList() const;
void setIntList(const QList<int> &list);
private:
QList<int> m_list; // 私有的
};
#endif
私有字段 m_list 用于引用原始数据,可以通过构造函数的 list 参数设置,也可以通过 setIntList 方法设置。
下面代码实现构造函数,主要是初始化私有成员。
MyItemModel::MyItemModel(QObject *parent)
: m_list(QList<int>()), QAbstractItemModel(parent)
{
}
MyItemModel::MyItemModel(const QList<int> &list, QObject *parent)
: QAbstractItemModel(parent), m_list(list)
{
}
下面代码实现 parent 方法。由于是整数列表,数据只有一层,所以直接返回 QModelIndex() 即可。
QModelIndex MyItemModel::parent(const QModelIndex &child) const
{
// 简单的列表不需要父子层次
// 使用无参构造函数表示无效索引
return QModelIndex();
}
接着是实现返回数据列表的行数和列数。
int MyItemModel::rowCount(const QModelIndex &parent) const
{
// 一样的道理,不能有父级数据
if (parent.isValid() ){
return 0;
}
// 返回QList中元素个数,每个元素代表一行
return m_list.size();
}
int MyItemModel::columnCount(const QModelIndex &parent) const
{
if(parent.isValid())
return 0;
// 咱们这个模型永远只有一列
return 1;
}
实现 index 方法,为数据项创建索引。
QModelIndex MyItemModel::index(int row, int column, const QModelIndex &parent) const
{
// 因为此列表不存在爷爷/孙子/父/子关系
// 所以如果索引是有效的,说明它不对
// 咱们这个列表是没有父级的
if(parent.isValid())
return QModelIndex(); // 有效索引不是咱们想要的,返回无效索引
// 如果索引无效,说明是顶层数据,是咱们想要的
return createI