版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Qt6.2/C++程序设计与桌面应用开发21世纪高等学校计算机类课程创新规划教材–微课视频版教材目录第1章初识Qt框架第2章Qt开发基础第3章界面设计组件第4章主框架窗口第5章对话框设计第6章事件系统第7章文件与数据库第8章模型/视图结构第9章图形绘制第10章多媒体编程第11章网络编程第12章进程与线程教材目录第8章模型/视图结构8.1概述8.2数据模型8.3代理组件8.4视图组件8.1概述模型/视图结构是Qt中用界面组件显示与编辑数据的一种结构,它实现了数据和界面的分离,类似于M-V-C(Model-View-Controller)程序设计模式。8.1.1基本结构Qt的模型/视图结构由三部分组成,即模型(Model)、视图(View)和代理(Delegate)。如图8.1所示。8.1.1基本结构Data(数据)就是指实际的数据源,如计算机系统的磁盘文件结构、数据库的数据表或计算机系统内存中的字符串列表(QStringList)等;Model(模型)负责数据的提取与更新,并将数据提供给视图显示或编辑;View(视图)是应用程序的界面组件,它从模型获得数据项的模型索引(ModelIndex),然后通过模型索引获取到实际的数据;Delegate(代理)的功能是让用户定制数据的界面显示和编辑方式,当视图中的数据被编辑时,代理通过模型索引与数据模型通信,并为数据的编辑提供一个合适的编辑器。8.1.2数据表示在Qt的模型/视图结构中,模型组件是核心,它为视图组件和代理组件提供存取数据的标准接口。不管数据源中的数据结构如何,Qt数据模型中的数据均以表格的层次结构来组织,视图组件通过这种逻辑结构来存取模型中的数据。在Qt中,常见的数据模型表现形式有3种,即列表模型(ListModel)、表格模型(TableModel)和树(TreeModel)模型。它们的数据表示方式如图8.2所示。从图中可以看出,虽然数据模型的表现形式不一样,但数据模型中存储数据的基本单元都是项(item),每个项有一个行号、一个列号,还有一个父项(parentitem)。在列表和表格模式下,所有的项都有一个相同的顶层项(rootitem);在树状结构中,尽管行号、列号、父项有点复杂,但是由这3个参数完全可以确定一个项的位置,从而存取项的数据。1、模型索引为了确保数据的表示与数据的获取相分离,Qt引入了模型索引(modelindex)的概念。通过数据模型存取的每一个数据都使用一个模型索引来表示,视图和代理都通过这个模型索引来获取实际的数据。通常情况下,数据模型中的模型索引就是一个Qt的QModelIndex对象,它是对一块数据的临时引用,可以用来检索或修改模型中的数据。注意,QModelIndex模型索引提供的存取数据的指针是临时的,因为数据模型随时都可能对内部数据的组织形式进行更改。如果需要使用持久性的模型索引,则要使用QPersistentModelIndex对象。例如,下面的代码:QModelIndexmodelIndex=model->index(row,column,parent);获取model数据模型中行号为row、列号为column位置的数据项的模型索引。其中,参数parent表示该数据项的父项的模型索引,它也是一个QModelIndex对象。2、行号和列号在Qt数据模型中,数据一般都是以表格的形式来组织的,所以,可以通过行(row)号和列(column)号来对需要访问的数据项进行定位。需要注意的是,这并不意味着数据源中的数据是以二维数组的方式存储的,使用行号和列号只是一种约定,以确保模型/视图结构中各组件间可以相互通信。注意,数据模型中数据项的行号和列号都是从0开始的。3、父项在Qt的数据模型中,列表模型或表格模型的所有数据项都以根项(Rootitem)为父项(parentitem),所以,它们都是顶层数据项(Toplevelitem)。顶层数据项的父项模型索引统一用QModelIndex()来表示。例如,对于图8.3所示的表格模型中的3个数据项A、B和C,可以使用如下的代码来获取其模型索引。对于树模型来说,情况要复杂一些,因为并不是所有的数据项都处于顶层。树模型中的每一个数据项都可能拥有自己的父项,当然它也可能是其他数据项的父项。所以,在获取树模型数据项的模型索引时,必须明确指定其行号、列号和父项。例如,对于图8.4所示的树模型中的3个数据项A、B和C,可以使用如下的代码来获取其模型索引。4、项角色Qt数据模型中的数据项可以作为不同的角色(itemrole)在其他组件中使用,也可以为不同的情况提供不同类型的数据。例如,Qt::DisplayRole用于访问可以作为文本显示在视图中的字符串。通常情况下,数据模型中的数据项都包含了一些不同角色的数据,这些标准的角色由枚举变量Qt::ItemDataRole来定义,常用的角色如表8.1所示。通过为每个角色提供适当的项目数据,模型可以为视图和代理提供提示,告诉它们数据应该怎样展示给用户。角色指出了从模型中引用哪种类型的数据,视图可以使用不同的方式来显示不同的角色,如图8.5所示。8.1.3相关Qt类模型/视图结构功能是通过众多的Qt类共同实现的,这些类按功能分为3组,分别为模型类、视图类和代理类。1、模型类模型类也被称为数据模型类或数据模型组件。在Qt中,所有基于项数据(itemdata)的数据模型都是基于QAbstractItemModel类的,这个类定义了视图和代理存取数据的接口。2、视图类在Qt的模型/视图结构中,与视图相关的几个主要类及其描述,如表8.3所示。3、代理类在Qt的模型/视图结构中,与委托代理相关的几个主要类及其描述如表8.4所示。8.2数据模型数据模型是Qt模型/视图结构的核心,它实现了数据与视图的分离。下面介绍几种常用的数据模型的使用方法。8.2.1QAbstractListModel模型QAbstractListModel是所有一维列表数据模型的抽象基类,它继承自QAbstractItemModel类,又被QStringListModel、QVirtualKeyboardSelectionListModel和QWebEngineHistoryModel类直接继承。QAbstractListModel类是抽象类,不能直接实例化,程序中使用其子类来创建数据模型。下面是QStringListModel数据模型类的继承关系【例8.1】编写一个Qt应用程序演示QStringListModel数据模型的使用方法。(1)启动QtCreator集成开发环境,创建一个名为examp8_1的Qt应用程序。该应用程序主窗口基于QMainWindow类。(2)双击项目界面文件mainwindow.ui,打开QtDesigner界面设计工具。在QtDesigner中设置应用程序主窗口界面,设计工具栏上的功能按钮及相应的槽函数,添加列表项单击信号的槽函数。界面对象名称及属性请参见教材源码。(3)在项目主窗口类MainWindow中添加QStringListModel数据模型指针model,以及初始化数据模型和列表视图的私有成员函数initModel()和initView()。代码如下:(4)打开mainwindow.cpp文件,添加成员函数initModel()和initView()的实现代码。(5)在MainWindow类的构造函数中调用initModel()和initView()函数,完成数据模型和视图的初始化工作。(6)在槽函数中添加代码,实现工具按钮的相应功能。代码如下:(7)实现状态栏信息提示功能。当用户单击列表项中的数据项时,在应用程序状态栏中显示该数据项的行号和列号信息。代码如下:(8)构建并运行程序。8.2.2QFileSystemModel模型QFileSystemModel数据模型用于访问本机文件系统数据,将该数据模型与视图组件QTreeView结合,可以实现本机文件系统资源的目录树显示。QFileSystemModel类继承于QAbstractItemModel,它没有被其他类继承。该类提供了丰富的成员函数,可以使用这些成员函数来创建目录、删除目录、重命名目录,获取文件名称、目录名称、文件大小和详细信息等。【例8.2】使用QFileSystemModel数据模型,实现一个简单的文件资源浏览器。(1)启动QtCreator集成开发环境,创建一个名称为examp8_2的Qt应用程序。选择主窗口基类QWidget,不生成界面文件。(2)创建模型及视图对象。打开项目文件widget.h,在其中添加如下代码,为主窗口类Widget创建私有访问权限的数据模型及视图组件对象。(3)初始化数据模型及视图对象。打开项目文件widget.cpp,在主窗口类Widget的构造函数中添加代码,对主窗口、数据模型及视图进行初始化。代码如下:(4)构建并运行程序。8.2.3QStandardItemModel模型QStandardItemModel是以项数据为基础的标准数据模型类,它继承自QAbstractItemModel,没有直接子类。其部分成员函数及功能如表8.7所示。【例8.3】编写一个Qt应用程序,演示QStandardItemModel数据模型的使用方法。(1)启动QtCreator集成开发环境,创建一个名为examp8_3的Qt应用程序。该应用程序主窗口基于QWidget类。(2)打开Widget.h头文件,在Widget类中添加数据模型对象指针model及成员函数createModel()和initView()。代码如下:(3)打开Widget.cpp文件,编写createModel()和initView()函数的实现代码,并在Widget类的构造函数中调用它们。代码如下:(4)构建并运行程序。8.2.4QAbstractTableMode模型QAbstractTableMode是所有表格数据模型的抽象基类,它继承自QAbstractItemModel其直接子类为QSqlQueryModel类,间接子类还有QSqlTableModel类和QSqlRelationalTableModel类。这些类之间的继承关系如图8.10所示。QAbstractTableMode类定义了一些表模型的公共接口,它不能被直接实例化,实际编程时需要使用它的3个子类对象。1、QSqlQueryModelQSqlQueryModel是一个基于SQL查询的只读数据模型。它封装了执行SELECT语句从数据库查询数据的功能,只能作为只读数据源使用,不能对数据库中的数据进行编辑。【例8.4】编写一个Qt应用程序,演示QSqlQueryModel数据模型的使用方法。(1)创建一个名为qt_examp8_4db的MySQL数据库,并在库中添加一张名为students的数据表。Students数据表的字段及测试数据如图8.12所示。(2)启动QtCreator集成开发环境,创建一个名为examp8_4的Qt应用程序。该应用程序主窗口基于QMainWindow类。(3)双击mainwindow.ui界面文件,打开QtDesigner设计工具。删除默认的菜单栏;在主窗口中心区域添加一个名tableView的QTableView视图组件;创建一个名为“打开”的Action,并将其添加到工具栏上。(4)打开mainwindow.h文件,为类MainWindow添加2个私有成员变量db和model,分别表示数据库和数据模型。如下所示。(5)打开mainwindow.cpp文件,在“打开”Action的槽函数中编写代码。如下所示。(6)构建并运行程序。2、QSqlTableModelQSqlTableModel
继承自QSqlQueryModel类,它是一个直接根据数据表名称来对数据表进行读/写的数据模型。使用该模型不需要熟悉SQL命令语法,只需要调用相应的函数即可。例如,下面的代码:【例8.5】编写一个Qt应用程序,演示QSqlTableModel数据模型的使用方法。(1)复制例8.4中的examp8_4项目,将项目名称修改为examp8_5。(2)启动QtCreator集成开发环境,打开项目examp8_5,将主窗口标题修改为“例8.5”。(3)打开mainwindow.cpp文件,修改槽函数on_action_open_triggered()中的代码如下所示。将原代码中的:
model=newQSqlQueryModel(this);model->setQuery("select*fromstudents");修改为:
model=newQSqlTableModel(this);model->setTable("students");model->select();(4)构建并运行程序。3、QSqlRelationalTableModelQSqlRelationalTableModel继承自QSqlTableModel类,并且对其进行了扩展,提供了对数据表中外键的支持。也就是说,QSqlRelationalTableModel是可以处理关系数据表的数据模型。QSqlRelationalTableModel类的主要函数与QSqlTableModel类相同。不同的是,它新增了一个名为setRelation()成员函数,用于设置外键的关联数据表和关联字段。【例8.6】编写一个Qt应用程序,演示QSqlRelationalTableModel数据模型的使用方法。(1)创建一个名为qt_examp8_6db的MySQL数据库,并在库中创建students、departments和majors三张数据表。数据表字段名称及测试数据如图8.14~8.16所示。(2)复制例8.5中的examp8_5项目,将项目名称修改为examp8_6。(3)启动QtCreator集成开发环境,打开项目examp8_5,将主窗口标题修改为“例8.6”。(4)打开mainwindow.cpp文件,修改槽函数MainWindow::on_action_open_triggered()中的代码,如下所示。(5)构建并运行程序。8.3代理组件在Qt的数据模型/视图结构中,代理组件主要用于数据的编辑,分为缺省代理和自定义代理两大类。8.3.1缺省代理一般情况下,模型/视图结构中的视图组件都会提供一个缺省的代理组件,来实现视图与数据模型之间数据的同步更新。8.3.1缺省代理【例8.7】一个简单的缺省代理应用实例。(1)复制例8.5中的项目examp8_5,并将名称修改为examp8_7。(2)启动QtCreator集成开发环境,打开项目examp8_7。为项目中添加2个新的工具栏按钮,其中“保存”按钮用于手动保存数据的更改;“撤销”按钮用于取消数据在保存之前的更改操作。为视图组件tableView添加一个双击信号的槽函数on_tableView_doubleClicked()。(3)打开mainwindow.cpp文件,在槽函数on_action_open_triggered()中添加如下代码,设置数据模型的数据保存方式。model->setEditStrategy(QSqlTableModel::OnManualSubmit);QSqlTableModel::OnManualSubmit为手动数据保存方式。(4)在槽函数on_action_save_triggered()、on_action_undo_triggered()和on_tableView_doubleClicked()中编写代码,实现数据保存及撤销功能。如下所示。(5)构建并运行程序。8.3.2自定义代理在一般的情况下,Qt模型/视图结构中的缺省代理编辑器可以满足应用程序开发的需要,但有时候仍然显得不够灵活。例如,双击图8.17中的“性别”数据单元格,显示的是QLineEdit类型的缺省代理编辑组件,对于枚举类型的数据使用文本框输入就不是很方便。此时,需要自己定义一个合适的代理编辑组件,比如QComboBox组合框组件,如图8.18所示。【例8.8】一个简单的自定义代理实例。本实例程序在例8.7项目基础上实现,运行结果如图8.18所示。(1)复制例8.7中的项目examp8_7,将项目名称修改为examp8_8。(2)启动QtCreator集成开发环境,打开项目examp8_8。在项目中添加一个名为ComboDelegate的C++类。(3)在类ComboDelegate中添加4个公有成员函数,分别为createEditor()、setEditorData()、setModelData()和updateEditorGeometry()。(4)在类ComboDelegate的实现文件中编写代码,实现自定义的4个成员函数的功能。(5)打开mainwindow.h文件,在MainWindow类添加一个私有的ComboDelegate对象。如下所示。private:ComboDelegatecomboDelegate;接着,打开mainwindow.cpp文件,在槽函数on_action_open_triggered()中添加代码,为视图组件添加自定义的代理组件。如下所示。ui->tableView->setItemDelegateForColumn(3,&comboDelegate);(6)构建并运行程序。8.4视图组件视图组件就是一些用于显示数据的界面部件,它们可以是Qt预定义的,当然也可以是自定义的。在前面的例题中,使用了几个Qt的预定义模型视图,如QListView、QTableView
和QTreeView8.4.1QAbstractItemView类QAbstractItemView类是使用QAbstractionModel的每个标准模型视图类的基类,该类提供了一个标准接口,用于通过信号和插槽机制与模型进行互操作,使子类能够随着模型的更改而保持最新。另外,该类为键盘和鼠标导航、视口滚动、项目编辑和选择提供了标准支持。【例8.9】编写一个Qt应用程序,使用QAbstractItemView类派生出一个模型视图,通过这个模型视图来渲染数据模型中的数据。程序运行结果如图8.19所示,主窗口左侧为标准模型视图QListView,右侧为自定义的平铺模型视图。(1)启动QtCreator集成开发环境,创建一个名称为examp8_9的Qt应用程序。选择主窗口基类QMainWindow,不生成界面文件。(2)为应用程序添加新的视图类,该类从QAbstractItemView继承。其头文件如下所示。(3)编写TiledListView类的实现代码,实现类中各个函数的功能。(4)在主框架窗口类MainWindow的构造函数中添加代码,设置数据模型并初始化主窗口中的组件。(5)构建并运行程序。8.4.2QListView视图QListView表示标准的列表模型视图;其继承关系如第3章的图3.1和图3.22所示。【例8.10】编写一个Qt应用程序,示例QListView视图组件的应用。(1)复制例8.1中的项目examp8_1,将项目名称修改为examp8_10。启动QtCreator集成开发环境,打开项目examp8_10。(2)双击mainwindow.ui文件打开界面设计器,在主窗口中增加一个名为toolBar2的工具栏,并为该工具栏添加一些测试用的Action。Action名称如图8.20所示。(3)打开mainwindow.cpp文件,为添加的Action编写代码。如下所示。(4)构建并运行程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度加工承揽合同:航空零件精密加工协议2篇
- 新能源汽车上游原材料供应情况
- 2024年定制面包砖供应协议要约版B版
- 2024年度上海汽车售后服务合同3篇
- 2024年度企业财务分析与咨询合同书版B版
- 二零二四年度艺人经纪合同:甲方于二零二四年与乙方签订艺人经纪合同3篇
- 2024年度工程招投标安全评估合同3篇
- 2024年家居用品买卖协议细则一
- 2024年大数据中心建设与合作运营合同
- 2024年度软件开发与技术保密协议3篇
- IPD新产品研发流程优化与研发项目管理课件
- 北林园林树木学各论课件
- 食堂经营管理方案课件
- 浦发银行个人信用报告异议申请表
- 室内设计专题讲座课件
- 阿特拉斯拧紧工具维修培训教材课件
- 毕业论文-交联聚乙烯电缆电树、水树产生原因 及生长的理论分析
- 电缆检测报告
- 血压计校验记录
- 华北理工大学生物药剂学与药物动力学教案
- 胎盘早剥预案演练脚本
评论
0/150
提交评论