QStandardItemModel 是基于项的模型类,每个项是一个 QStandardItem 对象可以存储各种数据。QStandardItemModel 通常与QTableView 组成模型/视图结构,实现二维数据的管理,本节设计一个示例项目QStandardItemModel_QTableView主要涉及如下三个类的使用方法。
QStandardItemModel:基于项的模型类,他维护了一个二维的项数组,每一个项是一个QStandardItem对象,用于存储文字,字体,对齐方式等各种角色的数据。
QTableView:二维表格视图组件类,基本显示单元是单元格。通过函数setMidel ()设置一个QStandardItemModel类的数据模型后,一个单元格,显示数据模型中的一个项。
QItemSelectionModel:项选择模型类,它是用于跟踪视图组件的单元格选择状态的类,需要指定一个QStandardItemModel类的数据模型,当在QTableView组件上选择一个或多个单元格时,通过项选择模型可以获得选中单元格的模型索引。
QTableView类
QTableView继承于QAbstractItemView类,主要的属性和接口函数见QAbstractItemView类的介绍,QTableView新定义的属性主要用于控制显示效果,在UI可视化设计时就可以设置QTableView组件的各种属性。
QTableView组件有水平表头,垂直表头,都是QHeaderView对象,可以设置和返回表头对象,相关函数定义如下:
void QTableView::setHorizontalHeader(QHearView* header) //设置水平表头
void QTableView::setVerticalHeader(QHearView* header) //设置垂直表头
QHearView* QTableView::verticalHeader()//返回水平表头对象指针
QHearView* QTableView::horizontalHeader() //返回垂直表头对象指针
当QTableView组件使用一个QStandardItemModel对象作为数据模型时,它会自动创建表头对像,垂直表头一般显示行号,水平表头一般显示列的标题。
QStandardItemModel类
QStandardItemModel 是以项为基本数据单位的模型类,每一个项是一个QStandardItem 对象。项可以存储各种角色的数据,如文字,字体,对齐方式,图标,复选状态等,如果以多行多列的二维数组形式存储项,就是表格模型,如果表格模型只有一列,那就是列表模型,如果在储存项时为项指定父项,就可以构成树状模型。
如果一个QStandardItemModel 对象是表格模型,将它设置为QTableView组件的数据模型后,视图组件就用表格的形式显示模型的数据,并且根据每个单元格的项定义的各种角色数据控制显示效果。
对数据的操作是通过QStandardItemModel 类的接口函数实现的,QStandardItemModel 的父类是QAbstractItemModel ,QStandardItemModel新定义了一些接口函数,下面分组介绍常用的一些接口函数
1,设置行数和列数
void setRowCount(int rows) //设置数据模型的行数
void setColumnCount (int columns) //设置数据模型的列数
如果设置的列数大于1,就是表格模型,如果设置的列数等于1就是列表模型
2,设置项
设置了模型的行数和列数后,就相当于设置了模型的大小,还需要用函数 setItem()为表格的每个单元格设置一个QStandardItem 对象,设置setItem()有两种参数形式,定义如下
void setItem(int row,int column,QStandardItem* item) // 用于表格模型
void setItem(int row,QStandardItem* item) // 用于列表模型
3,获取项
函数Item()根据行号和列号返回模型中摸个单元的项,函数itemFromIndex()根据模型索引返回某个单元的项,这两个函数定义如下
QStandardItem* item(int row,int column) //根据行号和列号返回项
QStandardItem* itemFromIndex(QModelIndex &index) //根据模型索引返回项
函数indexFromItem()根据项返回模型索引,其定义如下
QModelIndex indexFromIndex(QStandardItem* item)//根据项返回模型索引
4,添加行或列
函数appendRow()用于在模型的最后添加一行,并且为添加行的每个单元设置QStandardItem 对象
void appendRow(const QList<QStandardItem*> &items) //用于表格模型
void appendRow(QStandardItem* item) //用于列表模型
函数appendColumn()用于在模型中添加一列,一般只用于表格模型,其函数定义如下
void appendColumn(const QList<QStandardItem*> &items) //在表格模型中添加列
5,插入行或列
函数insertRow()用于在模型中插入一行,有3中参数形式,其中的2种定义如下
void insertRow(int row,const QList<QStandardItem*> &items)//用于表格模型
void insertRow(int row, QStandardItem* item) //用于列表模型
还有一种适用于树状模型,定义如下
bool insertRow(int row,const QModelIndex &parent = QModelIndex())//用于树状模型
参数parent是父节点的模型索引,row是插入位置的行号,这种参数的函数功能是在父节点下面插入一个节点,但是没有为节点设置一个QStandardItem对象,需要再次调用setItem()函数为新插入的节点设置QStandardItem对象。
函数insertColumn()用于在模型中插入列,只有表格模型或树状模型才需要插入列
void insertColumn(int column ,QList<QStandardItem* > *&items) //用于表格模型
bool insertColumn(int column ,const QModelIndex &parent = QModelIndex()) //用于树状模型
6,移除行和列
可以从表格模型中移除一行或一列,模型的行数或列数就会相应减一,但是移除的QStandardItem对象不会被删除,需要单独用delete删除,移除行或列的两个函数定义如下,返回值是被移除的QStandardItem对象列表。
QList<QStandardItem*> takeRow(int row) //移除一行,适用于表格模型
QList<QStandardItem*> takeColumn(int column)//移除一列,适用于表格模型
函数takeItem()用于移除一个项,它适用于列表模型
QStandardItem* takeItem(int row,int column=0) //移除一项,适用于列表模型
7,水平表头和垂直表头
数据模型有水平表头,水平表头的列数等于表格模型的列数,表头每个单元也是QStandardItem对象,可以用函数setHorizontalHeaderItem()为表头的某一列设置项。
void setHorizontalHeaderItem(int column ,QStandardItem* item)//为表头某列设置项
如果只是设置表头各列文字,可以使用函数setHorizontalHeaderLabels(),它用一个字符串列表的内容设置表头各列的文字
void setHorizontalHeaderLabels(const QStringList* labels) //用字符串列表的内容设置表头各列的文字
还有函数可以用于返回表头某列的项,或移除表头某列的项,函数定义如下
QStandardItem* horizontalHeaderItem(int column) //返回水平表头某列的项
QStandardItem* takeHorizontalHeaderItem(int column) //移除水平表头某列的项
同样,还有操作垂直表头的函数,定义如下
void setVerticalHeaderItem(int row,QStandardItem*item)
void setVerticalHeaderItem(const QStringList * labels)
QStandardItem* verticalHeaderItem(int row) //返回水平表头某列的项
QStandardItem* takeverticalHeaderItem(int row) //移除水平表头某列的项
表格数据的垂直表头默认以行号作为文字,一般不需要处理。
8,函数clear()
QStandardItemModel 有一个接口函数clear(),它用于清除模型内所有的项,行数和列数都会变为0。
9,QStandardItemModel的信号
QStandardItemModel新定义了一个信号itemChanged(),在任何一个项的数据发生了改变时,此信号都会被发生。信号函数定义如下,其中的参数 item是数据改变了的项
void itemChanged(QStandardItem* item)
QStandardItem类
QStandardItemModel 数据模型中的每一个项都是一个QStandardItem对象,QStandardItem存储了一个项的各种特性参数,还可以存储用户自定义数据,一个项可以添加子项,子项也是QStandardItem对象,所以QStandardItem也可以作为树状模型的项。
1,特征读写函数
QStandardItem没有父类,它存储项的各种特性参数和设置内容,有一些成对的读写函数分别用于读取和设置各种特性,常用的一些函数如下
读取函数 | 设置函数 | 设置函数的功能 |
text() | setText() | 设置项的显示文字 |
toolTip() | setToolTip() | 设置项ToolTip显示文字 |
icon() | setIcon() | 设置项的图标 |
font() | setFont() | 设置项的字体 |
函数setFlags()用于设置项的标志,其函数定义如下
void QStandardItem::setFlags(Qt::ItemFlags flags)
2,用户自定义数据
可以用函数QStandardItem::setData()函数设置各种角色的数据,函数定义如下
void QStandardItem::setData(const QVariant &value,int rols=Qt::UserRole+1)
其中value是需要设置的数据,role是设置数据的角色,默认值是Qt::UserRole+1。设置了QStandardItem的一些单独的函数相当于设置了项的一些固定角色的数据,如函数setText(),设置了Qt::DisplayRole角色的数据,函数setToolTip()设置了Qt::ToolTipRole角色的数据,所有setData()一般用于设置用户自定义数据,可以设置多个用户数据,从Qt::UserRole递增角色数值即可。
函数data()返回指定角色数据,函数clearData()清除用setData()设置的所有角色的数据。
QVariant QStandardItem::data(int role=Qt::UserRole+1)
void QStandardItem::clearData()
3,管理子项的函数
一个QStandardItem对象可以添加子项,子项也是QStandardItem对象,这样就可以构成不限层级的树状结构,QStandardItem以二维表格的形式管理子项,可以添加多行多列的子项,QStandardItem管理子项的函数有如下这些。
void appendRow(const QList<QStandardItem*> &items) //添加一行多个项
void appendRow(QStandardItem* item) //添加一行,只有一个项
void appendColumn(const QList<QStandardItem*> &items)//添加一列多个项
void insertRow(int row,const QList<QStandardItem*> &items)//插入一行多个项
void insertRow(int row, QStandardItem* item) //插入一行,只有一个项
void inserRow(int row,int count)//在row行插入count个空行,为设置item
void insertColumn(int column ,QList<QStandardItem* > *&items)//插入一列,多个项
void inserColumn(int column,int count)//在column列插入count个空行,为设置item
void removeColumn(int column)//删除序号为column的列
void removeColumn(int column,int count)//从column列开始,删除count个列
void removeRow(int row)//删除序号为row的行,存储的项也被删除
void removeRow(int row,int count)//从row行开始,删除count个行
int rowCount()//返回子列的行数
int columnCount()//返回子列的列数
bool hasChildren()//这个项是否有子项
QStandardItem* child (int row,int column=0)//根据行号和列号返回子项
QStandardItem 的很多函数与QStandardltemModel 中的函数名称相同,功能也相同,只是操作对象不同。QStandardltemModel管理的是模型的顶层项,如果是列表模型或表格模型,各个项没有子项,QStandardltemModel 就直接管理模型中的所有项。如果是树状模型,那么QStandardltemModel管理的的就是所有顶层项(不是根项),也就是目录树中的一级节点,而每一个一级节点的直接子节点则通过QStandardltem类来管理,依次递推下去,就可以形成不限层级的树状模型。
QItemSelectionModel类
一个视图组件需要设置一个数据模型,还可以设置一个选择模型,QItemSelectionModel是选择模型类,它的功能是跟踪视图组件上的选择操作,给出选择范围,例如,给QTableView组件设置一个选择模型后,在QTableView组件上选择多个单元格时,通过选择模型就可以得到所有被选中的单元格的模型索引。
1,主要接口函数
需要用函数setModel()为选择模型设置数据模型,函数定义如下
void setModel(QAbstractItemModel* Model) //为选择模型设置数据模型
将数据模型,选择模型,视图组件这3种对象做好关联设置后,在视图组件上选择操作时选择模型就可以跟踪视图组件上的选择,QItemSelectionModel有一些接口函数可用于给处选择的项的模型索引等信息。
bool hasSelection() //是否有被选择的项,列如被选择的单元格
QModelIndex currentIndex() //返回当前项的模型索引
bool isSelected (const QModelIndex &index) //模型索引index的项是否被选中
QModelIndexList selectedIndexes() //返回所有被选中的项的模型索引列表,列表未排序
QModelIndexList selectedRows(int column=0) //返回column列所有被选中的项的模型索引列表
QModelIndexList selectedColumns(int row=0) //返回row行所有被选中的项的模型索引列表
QItemSelectionModel有几个函数用于清除选择,列如取消选择QTableView表格中被选择的单元格,各函数功能和触发信号见注释。
void clear() //清除选择模型,会触发selectionChanged()和currentChanged()信号
void clearCurrentIndex() //清除当前索引,会触发currentChanged()信号
void clearselection() //清除所有选择,会触发selectionChanged()信号
2,信号
QItemSelectionModel定义了几个信号,选择的当前项发生变化时会触发currentChanged()信号,函数定义如下
void currentChanged(const QModelIndex ¤t,const QModelIndex &previous)
其中,current是当前项的模型索引,previous是之前项的模型索引
选择发生改变时,例如在QTableView视图组件上选择多个单元格,或取消选择一些单元格,都会触发selectionChanged()信号,函数定义如下
void selectionChanged(const QItemSelection &selected,const QItemSelection &deselected)
其中,selected是被选择的项,deselected是被取消的项,它们都是QItemSelection 类的对象,QItemSelection类的indexes()返回一个模型索引列表。