模型Model:QStandardItemModel、QStandardItem

1、基本知识

1.1 类QabstractItemModel,QabstractListModel,QAbstractTableModel不保存数据,用户需要从这些类派生出子类,并在子类中定义某种数据结构来保存数据。与此不同,类QStandardItemModel负责保存数据,每个数据项被表示为类QStandardItem的对象
QStandardItem用来保存一个数据项,再使用QStandardItemModel将这些数据项组织起来,形成列表、表格或者树,以供其他视图类显示。

1.2 一个数据项由若干个『角色数据子项』对组成。类QStandardItem负责保存、访问这些数据。该类的内部定义了一个类型为QVector的容器,每个容器元素本质上存放一个『角色,数据子项』对。
由于各个角色对应的数据子项可能具有不同的类型,Qt使用QVariant来存放每个数据子项。当用户希望将一些数据存放在一个QStandardItem对象中时,可以调用其成员函数:
void setData ( const QVariant & value, int role) 将『role, value』对存入。
当用户希望读取该对象中的数据时,可以调用另外一个成员函数:

QVariant data ( int role = ) const 读取角色role对应的数据子项。

以上两个函数是QStandardItem的核心。有了这两个函数,我们就可以访问该类所表示数据项的任何一个『角色,数据子项』对。

1.3 然而,对于一些常用角色,该类提供了更加简洁、容易记忆的成员函数。例如,当一个数据项被显示在视图中时,它往往包含一些文字、一个图标,还可能包含一个复选框。角色Qt::BackgroundRole控制显示背景,Qt::FontRole控制文字字体,Qt::ForegroundRole控制文字颜色,Qt::CheckStateRole控制复选框的状态。该类提供的一组成员函数可以方便地访问这些常用角色对应的数据子项。成员函数setBackground()、background()分别设置/返回背景刷子。函数setFont()、font()分别设置/返回文字字体。函数setForeground()、foreground()分别设置/返回字体颜色。函数setCheckState()、checkState()分别设置/返回复选框状态。

1.4 如果数据集被表示为一个列表

如果数据集被表示为一个列表,我们可以调用类QStandardItemModel的成员函数appendRow()向列表中添加一个数据项,使用item()读取一个数据项,代码如下:

1.5 如果数据集被表示为一个表格

如果数据集被表示为一个表格,可以调用类QStandardItemModel的成员函数setItem()设定表格中的某个数据项,代码如下:

1.6 如果数据集被表示为一个树

如果数据集被表示为一个树,可以调用类QStandardItemModel的成员函数appendRow()向某个树节点添加子节点。通过多次调用该函数,可以构建一棵复杂的树。代码如下:

结论

因此,对于数据量不是很大、对性能要求不是很高的场合,我们可以使用类QStandardItemModel来表示一个数据集。否则,用户应该从QAbstractItemModel、QAbstractListModel或者QAbstractTableModel派生新类,自行管理数据集的存放与访问。

2、相关函数

2.1 构造函数

QStandardItemModel::QStandardItemModel(int rows, int columns, QObject *parent = nullptr) 是 QStandardItemModel 类的一种构造函数,用于创建一个具有指定行数和列数的标准项模型。

QStandardItemModel(QObject *parent = nullptr) 可以通过setRowCount和setColumnCount函数设置行和列,也可以通过setHorizontalHeaderLabels函数设置表头,间接确定列数

2.2 追加列\行

void appendColumn(const QList &items) 它可以在模型的最后一列后面添加一列并将给定的一组项目插入到新列中。

2.3 清除、删除并返回指定行或列

void QStandardItemModel::clear() 它用于删除模型中的所有行和列。

bool clearItemData(const QModelIndex &index) 它可以清空在指定索引处的项目的全部角色值。

QList QStandardItemModel::takeColumn(int column) 函数从模型中删除给定的列,并返回包含这一列中所有项目的列表。

QList takeRow(int row) 同上

QStandardItem * takeHorizontalHeaderItem(int column) 模型中删除指定的列的水平标题项目,并返回该项目的指针。

这个方法可以用来替换或移除水平头项目.

2.4 查找

QList findItems(const QString &text, Qt::MatchFlags flags = Qt::MatchExactly, int column = 0) const 它可以在模型中查找包含给定文本的项目。

2.5 设置水平\垂直表头项目

QStandardItem * horizontalHeaderItem(int column) const 它可以返回指定列的水平表头项目。 column: 指定要返回水平表头项目的列索引。

void QStandardItemModel::setHorizontalHeaderItem(int column, QStandardItem *item) 它可以在指定列中设置水平表头项目。

void setHorizontalHeaderLabels(const QStringList &labels) 它用来设置模型的水平表头标签.

QStandardItem * verticalHeaderItem(int row) const void setVerticalHeaderItem(int row, QStandardItem *item) void setVerticalHeaderLabels(const QStringList &labels) 用法同上

2.6 获得模型索引

QModelIndex QStandardItemModel::indexFromItem(const QStandardItem *item) const 它可以返回给定项目的模型索引。

2.7 插入

void insertColumn(int column, const QList &items) 它可以在指定的列之前插入一列,并在新列中插入给定的项目。

bool insertColumn(int column, const QModelIndex &parent = QModelIndex()) 它可以在给定父项目下的指定列之前插入一列。

void insertRow(int row, const QList &items) 用法参考列 

void insertRow(int row, QStandardItem *item) 在row行之前插入一行,项目只有一个 

bool insertRow(int row, const QModelIndex &parent = QModelIndex()) 用法参考列

2.8 根项目

QStandardItem * invisibleRootItem() const 它可以返回模型的隐藏根项目

2.9 item

QStandardItem * item(int row, int column = 0) const 它可以返回模型中指定行和列的项目。

2.10 itemFromIndex

QStandardItem * itemFromIndex(const QModelIndex &index) const 它可以返回模型中指定QModelIndex对应的项目。

2.11 项目原型

const QStandardItem * itemPrototype() const 它返回一个指向QStandardItem对象的常量指针,用于模型中新项目的初始化。

void QStandardItemModel::setItemPrototype(const QStandardItem *item) 它用来设置模型中新项目的初始化。

2.12 设置行数和列数

void setColumnCount(int columns) 设置列数 void setRowCount(int rows) 设置行数

virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override 返回列数

2.13 设置指定位置的项目

void setItem(int row, int column, QStandardItem *item) void setItem(int row, QStandardItem *item) 它们都用于在模型中设置指定位置的项目。

setItem(int row, int column, QStandardItem *item) row: 指定项目所在的行索引。

2.14 setItemRoleNames

void setItemRoleNames(const QHash &roleNames) 它允许在模型中设置项目的角色名称。

2.15 排序角色

int sortRole() const; 返回当前的排序角色。

void setSortRole(int role) ;用于设置排序角色

3、虚函数

3.1 virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override 返回列数

3.2 virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override 是一个虚函数,是在QAbstractItemModel的重载函数,它返回给定模型索引和角色的项目数据。 

3.3 virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override 是一个虚函数,是在QAbstractItemModel的重载函数,它用于接受并放置从拖动和放置操作传递来的数据.

3.4 virtual Qt::ItemFlags flags(const QModelIndex &index) const override 是一个虚函数, 是在QAbstractItemModel的重载函数,用于返回指定索引的项目的标志.

index:要返回标志的索引。 返回值是一个Qt::ItemFlags类型的标志, 可以是一个或多个标志的组合, 比如:

  • Qt::ItemIsEnabled:项目是否可用
  • Qt::ItemIsSelectable:项目是否可以被选中
  • Qt::ItemIsEditable:项目是否可以被编辑
  • Qt::ItemIsUserCheckable:项目是否有可以被用户选择的checkbox 这个函数的默认实现会返回Qt::ItemIsEnabled | Qt::ItemIsSelectable, 表示所有项目都可用和可选择.

3.5 virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const override 是一个虚函数, 是在QAbstractItemModel的重载函数,用于判断指定父级项目是否有子项目。

3.6 virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override 是一个虚函数, 是在QAbstractItemModel的重载函数,用于获取表头的数据。

3.7 virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override 是一个虚函数, 是在QAbstractItemModel的重载函数,用于获取指定行和列的项目的索引。

3.8 virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override 是一个虚函数, 是在QAbstractItemModel中重载函数, 用于在指定父级项目的指定列号之前插入指定数量的列。

3.9 virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override 同上 virtual QMap itemData(const QModelIndex &index) const override 是一个虚函数,是在QAbstractItemModel中重载函数,用于获取指定项目的所有数据。

3.10 virtual QMimeData * mimeData(const QModelIndexList &indexes) const override 是一个虚函数,是在QAbstractItemModel中重载函数,用于创建一个QMimeData对象,其中包含给定索引列表中项目的数据。

3.11 virtual QStringList mimeTypes() const override 是用来获取模型支持的MIME类型, 这个函数在Qt中被重载使用在拖拽/剪切粘贴上.

这两个函数主要是配合使用的,mimeTypes函数用于获取支持的MIME类型,mimeData函数用于创建MIME数据,在Qt中对于拖拽和剪切粘贴都会使用到这两个函数。

以上两个函数可以用来实现模型数据的拖拽剪切粘贴.

3.12 virtual QModelIndex parent(const QModelIndex &child) const override 是一个虚函数,是在QAbstractItemModel中重载函数,它返回给定索引所表示的项目的父项目。

3.13 virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override 是一个虚函数,是在QAbstractItemModel中重载函数,用于删除模型中指定位置的一些列。

3.14 virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override 同上

3.15 virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override 返回行数

3.16 virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override 是一个虚函数,是在QAbstractItemModel中重载函数,用于修改模型中指定索引项目的数据。

注意:由于QStandardItemModel 继承QAbstractItemModel,所以在使用setData的时候要使用QStandardItem的setData来实现。

3.17 virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override 是一个虚函数,是在QAbstractItemModel中重载函数,用于修改模型中的表头的数据。

注意:QStandardItemModel 中表头是通过QStandardItem来实现的,所以修改表头需要使用对应的QStandardItem来设置

3.18 virtual bool setItemData(const QModelIndex &index, const QMap &roles) override 是一个虚函数,是在QAbstractItemModel中重载函数,用于修改模型中指定索引项目的所有数据。

注意:由于QStandardItemModel 继承QAbstractItemModel,所以在使用setItemData的时候要使用QStandardItem的setData来实现。

3.19 virtual QModelIndex sibling(int row, int column, const QModelIndex &idx) const override 是一个虚函数,是在QAbstractItemModel中重载函数,用于在模型中查找具有相同父项目的索引。

注意:如果行号和列号大于模型中存在的行列数,返回的是一个无效索引。 

3.20 virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override 是一个虚函数,是在QAbstractItemModel中重载函数,用于按照给定的顺序对指定列进行排序。

注意: 当使用QStandardItemModel作为模型时,使用sort函数进行排序操作时,需要在每一项中设置sortRole属性,不然会出现无法排序的结果。

3.21 virtual Qt::DropActions supportedDropActions() const override 是一个虚函数,是在QAbstractItemModel中重载函数,用于返回模型支持的拖放操作。

返回值是Qt::DropActions类型的枚举值,表示支持的拖放操作。

该函数是Qt Model-View框架中的一部分,用于获取模型支持的拖放操作,返回值是Qt::DropActions枚举值的组合,包括Qt::CopyAction,Qt::MoveAction和Qt::LinkAction。

Qt::CopyAction 表示支持复制。 Qt::MoveAction 表示支持移动。 Qt::LinkAction 表示支持链接。

在拖放事件中,支持的拖放操作将在放下时进行使用,它是由拖放源和接受拖放的接收者共同决定的。

4 信号

void itemChanged(QStandardItem *item) 当项目中的数据发生改变时触发。

参数 item 是项目中数据发生改变的项目指针。

当项目中的数据发生改变时,该信号将被发送,可以在接收该信号的槽函数中进行相应的处理。这对于在项目数据发生变化时进行自动更新和同步是非常有用的。

例如,在用户在编辑表格中的单元格时,需要更新某个状态或者进行某些操作,你就可以使用此信号。

5 角色名称解释

角色名称是一种用来表示项目数据中的信息类型的名称. 在Qt模型/视图系统中,QStandardItemModel提供了多种角色来存储项目的不同数据,比如: 文本数据,图标数据,状态数据等. 每种角色都用一个整数来标识,比如Qt::DisplayRole表示项目显示的文本数据,Qt::DecorationRole表示项目显示的图标数据。 使用角色名称来访问数据可以避免直接使用整数标识符来访问数据,因为这样可以使得代码更具可读性,对维护和调试更友好。

Qt支持多种角色,其中一些是内置的,另一些是用户可以定义的. 在Qt中,角色是一个整数常量。 内置的角色包括: - Qt::DisplayRole: 显示在视图中的文本。这是默认角色,如果没有指定角色,这个角色的数据会被使用。 - Qt::DecorationRole: 用来显示图标或图片. - Qt::EditRole: 用于编辑项目的数据. - Qt::ToolTipRole: 显示工具提示. - Qt::StatusTipRole: 显示状态栏提示. - Qt::WhatsThisRole: 为“什么是这个?”提供信息. - Qt::SizeHintRole: 为每个项目设置大小.

用户可以定义的角色包括: - Qt::UserRole: 用户自定义角色的起点。可以使用这个角色以及更大的值来

你可能感兴趣的:(#,模型\视图\委托(自定义代理),qt)