Qt 常用类——QStandardItemModel

转载:落叶知秋时

类QabstractItemModel,QabstractListModel,QAbstractTableModel不保存数据,用户需要从这些类派生出子类,并在子类中定义某种数据结构来保存数据。

与此不同,类QStandardItemModel负责保存数据,每个数据项被表示为类QStandardItem的对象。接下来,我们主要从两个方面介绍类QStandardItemMode的内容。

  1. 首先阐述如何使用类QStandardItem保存一个数据项
  2. 再阐述如何使用类QStandardItemModel将这些数据项组织起来,形成列表、表格或者树,以供其他视图类显示

首先来看第一方面:

如前文所述,一个数据项由若干个『角色,数据子项』对组成。类QStandardItem负责保存、访问这些数据。该类的内部定义了一个类型为QVector的容器,

每个容器元素本质上存放一个『角色,数据子项』对。由于各个角色对应的数据子项可能具有不同的类型,Qt使用QVariant来存放每个数据子项。

当用户希望将一些数据存放在一个QStandardItem对象中时,可以调用其成员函数:

void setData ( const QVariant & value, int role)    //将『role, value』对存入。

当用户希望读取该对象中的数据时,可以调用另外一个成员函数:

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

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

该类提供了更加简洁、容易记忆的成员函数。例如,当一个数据项被显示在视图中时,它往往包含一些文字、一个图标,还可能包含一个复选框。

常用角色:

  • Qt::BackgroundRole控制显示背景,
  • Qt::FontRole控制文字字体,
  • Qt::ForegroundRole控制文字颜色,
  • Qt::CheckStateRole控制复选框的状态。

该类提供的一组成员函数可以方便地访问这些常用角色对应的数据子项:

  • 成员函数setBackground()、background()分别设置/返回背景刷子。
  • 函数setFont()、font()分别设置/返回文字字体。
  • 函数setForeground()、foreground()分别设置/返回字体颜色。
  • 函数setCheckState()、checkState()分别设置/返回复选框状态。

然后再来看第二方面:

类QStandardItemModel将类QStandardItem表示的数据项组织起来,形成列表、表格、树甚至更复杂的数据结构。

  • 该类提供了一组成员函数,向这些数据结构添加新的数据项,更改已经存在的数据项,或者删除已有的数据项。
  • 另一方面,作为一个模型类,它实现了QAbstractItemModel定义的接口函数,以使其他视图类能够访问模型中的数据项。

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

如代码段13-10所示。

  • 行①获取模型最顶层的根节点,
  • 行②创建一个QStandardItem对象,表示一个数据项,
  • 行③将该数据项作为根节点的子节点添加到列表中。

行②的构造函数在内部调用该类的setData()函数,将行②的QString对象作为Qt::DisplayRole对应的数据子项存入新构造的对象。

由于数据集本身是一个列表,所以我们使用QListView显示该数据集,读者可以运行该例子查看显示结果。

代码段13-10:使用QStandardItemModel处理列表

    QStandardItemModel listModel;QStandardItem *rootItem = listModel.invisibleRootItem();    //    行1for (int row = 0; row < 4; ++row){
QStandardItem
*item = new QStandardItem(QString("%1").arg(row) ); // 行2rootItem->appendRow( item ); //行3}QListView listView;listView.setModel ( & listModel );

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

由于这个代码段中的数据集是一个表格,所以使用QTableView显示该数据集。

代码段13-11:使用QStandardItemModel处理表格

    QStandardItemModel tableModel(4, 4);for (int row = 0; row < 4; ++row){for (int column = 0; column < 4; ++column) {QStandardItem *item = new QStandardItem(QString("%0,%1").arg(row).arg(column));tableModel.setItem(row, column, item);}}QTableView tableView;tableView.setModel( & tableModel );

 

3:如果数据集被表示为一个树,可以调用类QStandardItemModel的成员函数appendRow()向某个树节点添加子节点。

通过多次调用该函数,可以构建一棵复杂的树。代码段13-12构建一棵简单的树:最顶层的根节点有一个文字内容为“0”的子节点,

该子节点有一个文字内容为“1”的子节点。依此类推,“1”子节点有一个“2”子节点,“2”子节点有一个“3”子节点,形成一棵深度为4的树。

这棵树的每个节点都没有兄弟节点(具有相同父节点的多个节点被相互称为兄弟节点),感兴趣的读者可以修改这段代码,以使其中某些节点具有兄弟节点。

由于数据集是一棵树,我们使用QTreeView显示它。

代码段13-12,使用QStandardItemModel处理树:

QStandardItemModel treeModel;
QStandardItem *parentItem = treeModel.invisibleRootItem();
for (int i = 0; i < 4; ++i) {QStandardItem *item = new QStandardItem(QString("%0").arg(i));parentItem->appendRow(item);parentItem = item;
}
QTreeView treeView;
treeView.setModel( & treeModel );

类QStandardItemModel之所以能够表示列表、表格、树甚至更复杂的数据结构,得益于类QStandardItem在其内部定义了一个类型为

QVector<QStandardItem*>的容器,可以将每个容器元素所指的QStandardItem对象设定为子对象。表现在如图13-13所示的类图上,类QStandardItem和自身具有“children”关系。一个类和自身发生关联,在UML中被称为自关联(self association)。类QStandardItemModel定义了一个名为root的数据成员,逻辑上是一个指向QStandardItem对象的指针。这个对象可以设定多个QStandardItem的对象作为自己的子对象,而其中每个子对象又可以包含其他的子对象。依此类推,这棵树可以具有任意深度,每个父对象可以包含任意多个子对象。

 

 

很自然地,QStandardItemModel可以使用QStandardItem表示具有树状数据结构的数据集,如图13-14所示。

图中的每个小方框表示类QStandardItem的一个对象。如果小方框的边线为虚,相应的QStandardItem对象并不表示数据集中的任何数据,仅被用来表示某种数据结构。如果小方框的边线为实,相应的QStandardItem对象就表示数据集中的一个数据项。在右侧的图中,QStandardItemModel的数据成员root所指的对象表示一个不可见的根,而数据集的根(图中结点G)被表示为这个不可见根的一个子节点。

 

 

列表被看作一个特殊的树:不可见根具有若干个子节点,每个子节点表示列表中的一个数据项,不再包含任何子节点,如该图左侧所示。

而表格的表示方式反而麻烦一些。不可见根含有若干子节点(图中A,B,C),这些子节点并不表示数据集中的任何数据项。

第i个子节点会包含若干子节点(比如图中D,E,F),这些子节点才表示表格第i行的数据项。

最后再讨论一下QStandardItemModel表示数据集的优缺点:

使用QStandardItemModel表示数据集具有以下优点

  1. 该类使用QStandardItem存放数据项,用户不必定义任何数据结构来存放数据项;
  2. QStandardItem使用自关联关系,能够表达列表、表格、树甚至更复杂的数据结构,能够涵盖各种各样的数据集;
  3. QStandardItem本身存放着多个『角色,数据子项』,视图类、委托类或者其他用户定义的类能够方便地依据角色访问各个数据子项。

然而,这种表示方法也有局限性

  • 当数据集中的数据项很多时,施加在数据集上的某些操作的执行效率会很低。

      比如,设数据集是一个1万行、20列的表格,其中第10列存放的是浮点数。如果我们想计算这一列的平均值,按照图13-14,这需要遍历所有行,

取得第10列的QStandardItem对象,再依据角色“Qt::DisplayRole”取得对应的数据子项。由于这个数据子项的类型为QString,还需要将其转换为浮点数,

最后求所有浮点数的平均值。这些操作会耗费较长的时间。

因此,对于数据量不是很大、对性能要求不是很高的场合,我们可以使用类QStandardItemModel来表示一个数据集。

否则,用户应该从QAbstractItemModel、QAbstractListModel或者QAbstractTableModel派生新类,自行管理数据集的存放与访问。

转载于:https://www.cnblogs.com/fuqia/p/8908182.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ad19原理图标注_AD19中原理图的模板如何进行编辑?

我们在进行原理图设计的时候&#xff0c;有时候不想去用软件自带默认的模板&#xff0c;想要用自己设计的模板&#xff0c;就涉及到我们的模板怎么去编辑的呢&#xff1f;我们应该如何去编辑原理图自己设计的模板&#xff1f;操作步骤是怎么的呢&#xff1f;我们今天就以AD19为…

mysql+秘密_mysql不被人知的秘密

http://blog.csdn.net/yueguanghaidao/article/details/69333872011先建立两张表。1.student表2.grade表一&#xff1a;mysql的复制技术1.表与数据的复制->>实现表结构和数据的同步create table desttable select * from srctable;(desttable:目标表&#xff0c;srctable…

mysql一个表几亿数据_如何在mysql 造1亿条记录的大容量数据表?

背景及目标&#xff1a;现有数据1000w单表&#xff0c;为压力测试准备1亿条数据。步骤&#xff1a;1.将1000w条记录&#xff0c;除id外都导入到多个文件中&#xff1a;//DELIMITERDROP PROCEDURE if EXISTS createManyTable;create PROCEDURE createManyTable()BEGINDECLARE i …

windows键盘在mac上怎么识别_Mac电脑怎么使用pc键盘?

苹果电脑一般需要使用配套的mac键盘&#xff0c;毕竟按键和普通pc键盘不一样。但是总会遇到一些情况&#xff0c;比如配套的mac键盘坏了&#xff0c;而刚好有一个pc键盘&#xff0c;那么这时候苹果电脑要怎么用pc键盘呢&#xff1f;这边小编跟大家介绍mac电脑连接pc键盘以及设置…

LOJ#6002. 「网络流 24 题」最小路径覆盖

模板。 1 #include<iostream>2 #include<cstring>3 #include<cstdio>4 //#include<time.h>5 //#include<complex>6 //#include<set>7 //#include<queue>8 #include<algorithm>9 #include<stdlib.h>10 using namespace s…

zabbix mysql设置中文乱码_解决zabbix监控因php问题导致图形界面中文乱码方法

解决因编译php中添加了-enable-gd-jis-conv选项导致Zabbix监控系统图形界面中文乱码问题现象&#xff1a;php编译参数&#xff1a;说明&#xff1a;如果PHP编译时启用–enable-gd-jis-conv选项的话&#xff0c;那么非ASCII字符(例如汉字、拼音、希腊文和箭头) 会被当成EUC-JP编…

熟悉常用的HDFS操作

一、Hadoop提供的Shell命令完成相同任务&#xff1a; 在本地Linux文件系统的“/home/hadoop/”目录下创建一个文件txt&#xff0c;里面可以随意输入一些单词.在本地查看文件位置&#xff08;ls&#xff09;在本地显示文件内容使用命令把本地文件系统中的“txt”上传到HDFS中的当…

mysql 低端_mysql入门

相关了解(重点内容从标题一开始)目前主流数据库有:sqlserver, mysql, Qracle, SQLite, Access, MS SQL Server等, 我主要说的是mysql;以下几点需要记住!!!SQL包括了所有对数据库的操作, 主要由4个部分组1. 数据库定义语言(DDL): 用于定义和管理数据库对象, 包括数据库, 基本表,…

阿里云服务器由于被检测到对外攻击,已阻断该服务器对其它服务器端口的访问...

问题&#xff1a; (系统&#xff1a;CentOS 7.2 ) 前几天在阿里云服务器安装了Redis, 刚开始没有设置redis密码, 后台阿里云发送多次邮件提示如下&#xff1a; 经过几次波折才发现并彻底解决了问题&#xff1a; 原因&#xff1a; 估计是因为 Redis服务开启时没有设置密码 &…

批量找注入 python3+sqlmap结合

注入一直都是用sqlmap 导致本来就不怎么精通的手工注入现在就忘的一干二净 想实战练习 却一时又找不到有注入的网站 于是便有了这篇文章 想找个批量获取域名链接的工具 但都是只是获取域名而已 都没获取后面的参数 于是自己写了个只获取bing前10页的结果 输入q 结束循环…

golang 反射

参考&#xff1a;|--http://blog.51cto.com/speakingbaicai/1707637 |--https://studygolang.com/articles/6324 反射是在golang程序运行时检查变量所具有类型的一种机制。由于反射可以得出关于变量结构的数据&#xff08;即“关于数据的数据”&#xff09;&#xff0c;所以这也…

java硬件编程_关于JAVA并发编程你需要知道的——硬件篇

无论程序语言如何千变万化&#xff0c;他们都深深地根植于目前的计算机体系结构。左图是intel CPU的三级高速缓存设计&#xff0c;由于高速缓存对程序员基本不可见&#xff0c;因此可以抽象为右图。缓存的设计首先还是先谈谈左图。L1-cache分为两部分&#xff0c;i-cache存储指…

net Core做一个webApi的简单实例

用NetCore 和Dapper 和mySql做一个简单的实例&#xff0c; 一准备工作 1&#xff1a;VS2017windos系统&#xff0c;也可以用其他的操作系统和工具 2&#xff1a;一台Cenetos的虚拟机或者虚拟机 二&#xff1a;开始 1&#xff1a;用微软官方的netCore的ToDo项目改造&#xff0c;…

java 文件输出流_Java 文件输出流

Java IO教程 - Java文件输出流创建输出流要写入文件&#xff0c;我们需要创建一个FileOutputStream类的对象&#xff0c;它将表示输出流。// Create a file output streamString destFile "test.txt";FileOutputStream fos new FileOutputStream(destFile);当写入文…

MySQL5.7参数log_timestamps

最近测试MySQL 5.7.21 Community Server这个版本的MySQL数据库时&#xff0c;发现其错误日志的时间跟系统当前时间不一致&#xff0c;后面检查发现日期时间格式都是UTC时间&#xff0c;查了一下相关资料&#xff0c;原来在MySQL 5.7.2 之后日志文件里面的时间戳从默认的本地系…

Tidb集群加mysql_TiDB - 快速入门,集群搭建

TiDB 是开源分布式关系型数据库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP)的融合型分布式数据库产品&#xff0c;具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 …

python递归函数

递归函数简单来说就是函数的自我调用。使用递归函数很多时候可以使得代码简洁&#xff0c;优雅。可以把复杂的问题分解成简单的子问题。递归有无与伦比的魅力&#xff0c;从著名的计算机名言就可以看出递归的奇妙&#xff1a; To iterate is human,to recurse divine. 迭代者为…

java知识体系 servlet_03-Servlet 体系结构知识梳理

一、Servlet体系结构Java Web应用是基于Servlet规范运行&#xff0c;Servlet顶层类的关联如下图&#xff1a;从图可看出&#xff0c;Servlet规范基本围绕这几个类运行&#xff0c;其中&#xff0c;与Servlet主动关联的有3个类&#xff0c;分别是ServletRequest、ServletRespons…

testlink自带java api_java如何连接testlink

1.下载相关的jar包2.获取到testlink的url和key&#xff0c;注意&#xff1a;url不是testlink的连接地址&#xff0c;是连接地址/lib/api/xmlrpc.php3.测试是否连接成功public static void main(String args[]) {String url "http://test.tl.gmsd.lan/lib/api/xmlrpc.php&…

lr背景虚化_lr背景虚化_怎样拍出背景模糊的照片

除了锐化之外&#xff0c;要获得独特的&#xff0c;令人难忘的图像&#xff0c;还可以使用其他方法&#xff0c;例如&#xff0c;相反的效果-单个细节的模糊。这样的方法将使人们有可能专注于整个构图的中心人物&#xff0c;为图片增加情感色彩&#xff0c;动作&#xff0c;并为…