Qt-QStandardItemModel和QTableView

        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 &current,const QModelIndex &previous)

其中,current是当前项的模型索引,previous是之前项的模型索引

        选择发生改变时,例如在QTableView视图组件上选择多个单元格,或取消选择一些单元格,都会触发selectionChanged()信号,函数定义如下

void selectionChanged(const QItemSelection   &selected,const QItemSelection   &deselected)

其中,selected是被选择的项,deselected是被取消的项,它们都是QItemSelection 类的对象,QItemSelection类的indexes()返回一个模型索引列表。

代码实现

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值