代码链接
https://download.csdn.net/download/mohen_777/89488349
https://download.csdn.net/download/mohen_777/89488329
https://download.csdn.net/download/mohen_777/89449114?spm=1001.2101.3001.9499
1)问题描述
录入、保存一个班级学生多门课程的成绩,并对成绩进行分析。2)基本要求
a.通过键盘输入各学生的多门课程的成绩,建立相应的文件 input.dat。b.对文件 input.dat 中的数据进行处理,要求具有如下功能:
-
-
- 按各门课程成绩排序,并生成相应的文件输出。
- 计算每人的平均成绩,按平均成绩排序,并生成文件。
- 求出各门课程的平均成绩、最高分、最低分、不及格人数、60-69 分人数、70-79 分人数、80-89 分人数、90 分以上人数。
- 根据姓名或学号查询某人的各门课成绩,重名情况也能处理。c.界面美观。
-
3)测试数据
测试数据如下表所示:
学号 | 姓名 | 高等数学 | 英语 | 计算机导论 |
001 | 张磊 | 80 | 73 | 90 |
002 | 王鹏 | 76 | 69 | 70 |
003 | 黎明 | 60 | 78 | 69 |
004 | 刘鹏 | 55 | 66 | 60 |
005 | 李四 | 78 | 70 | 80 |
006 | 张佳 | 43 | 50 | 60 |
007 | 赵平 | 89 | 85 | 79 |
008 | 高洁 | 90 | 89 | 70 |
目录
一、 需求分析 1
背景介绍 1
程序的功能 2
输入输出的要求 2
涉及到的知识点 3
二、 概要设计 3
Qt 架构概览 3
模块组成 5
数据结构 9
数据库 10
三、 详细设计 11
C 语言定义相关的数据类型 11
各模块的类C 码算法 13
各函数的调用关系图、主要函数的流程图 18
四、 调试分析以及设计体会 21
测试数据 21
程序调试中遇到的问题以及解决问题的方法 27
课程设计过程经验教训、心得体会 36
五、 使用说明 42
六、 附录 48
参考书目 48
源程序清单(带注释) 48
一、 需求分析
-
- 背景介绍
随着信息技术在管理上深入广泛的应用, 管理信息系统技术也逐步走向成熟。管理信息系统是一个不断发展的学科, 任何一个要生存发展的单位, 都必须构建与自身特点相符合的管理信息系统。目前, 学校办学规模的扩大和招生人数的增加, 给学校对于学生成绩管理维护造成了压力。因此及时建立一个学生成绩管理系统是学校管理工作中异常重要的一个环节, 学生成绩管理的计算机化是整个学校教务管理中的必要部分, 并占着越来越重要的份量。而且利用学生成绩管理维护系统可以减少学院教学人员的工作量, 缩小开支, 节省时间, 提高工作效率, 学生也能够及时查询到自己的考试成绩, 以便于及时总结自己在某门课程中学习的不足, 从而投入到更好的学习计划。因此, 针对这一状况开发出一套学生成绩管理系统非常必要。
美国麻省理工学院最早在 20 世纪 70 年代提出了数字化校园的概念, 并且
经过了多年的努力, 建立了一个较成熟的数字化校园平台。目前美国已经有 85% 的高校可以为学生提供数字化信息管理服务。在欧洲地区, 各大高校也陆续建立了信息化管理系统平台。管理信息系统一般采用的模式是集中统一管理全局数据信息的中央数据库模型, 软件开发的系统架构也是以C/S, 或者B/S 模式设计为主的, 它们从全局的角度统筹管理整个学校的教学资源, 用集中数据平台的方式提高学校的管理效率, 加快数据流通速度。经过多年的努力尝试, 目前国外高校的这种数字化管理模式平台已逐步走向成熟, 其运行状况也处于一种比较稳定的阶段。
在我国, 随着教育事业的发展, 各学校在信息化建设的过程中经历了多年的努力探索, 且取得了一些成绩。目前, 国内一些学校在吸收借鉴国内外先进的信息管理模式的同时, 结合本校的实际情况, 设计开发符合自己条件的现代化信息管理系统, 譬如学生成绩管理系统等。纵观目前我国信息管理系统的研究现状, 在用户信息安全维护和信息更新化方面还存在一定的不足。由于计算机网络的形式多样性、分布不均匀性等特征, 易受病毒、黑客等攻击的现象时常发生, 因此, 加强高校教务管理系统的安全维护措施就显得尤为重要。
在信息技术高度发达的今天, 应用先进的 IT 技术实现学生信息管理系统的工作已相继开展。实现高校学生成绩管理的信息化, 不仅可以提高效率, 而且通过对课程及成绩的相关数据进行深入挖掘和分析, 能够提高教务管理工作水
平。另外, 实现学生成绩信息管理系统, 具有以下优点: (1) 大量的数据存储, 可以方便存储历届学生的档案信息; (2) 检索速度快, 学生可以通过上网及时地查到各科成绩; (3) 节约劳动力, 只需几名信息录入员就可以实现成绩的录入、统计, 提高了工作效率; (4) 通过学校信息化的探索, 在研发过程中既可积累经验, 也可以为将来学校教务管理信息化做好准备。
-
- 程序的功能
为了对学生的成绩进行管理, 根据实际需要设计一个学生成绩管理系统, 系统实现的主要功能包括:增加学生记录、修改学生记录、删除学生记录、查询学生记录、保存学生记录、打开数据库、新建数据库、显示统计信息、导出到 Excel、还原修改等, 功能分析如下:
-
-
- 增加学生记录:增加学生信息, 包括学号, 姓名, 高等数学成绩, 英语成绩,计算机导论成绩
- 修改学生记录:通过学号或姓名查找到学生, 然后对学生信息进行修改
- 删除学生记录:删除指定学生记录
- 查询学生记录:根据学生学号, 查找学生的基本信息
- 保存学生记录:将学生信息保存到文件中, 从而实现永久保存
- 打开数据库:打开现有已经保存好的学生数据,然后对学生信息进行查询和修改
- 新建数据库:创建一个新的数据库,对学生信息进行持久化保存
- 显示统计信息:计算并显示各门课程的平均成绩、最高分、最低分、不及格人数、60-69 分人数、70-79 分人数、80-89 分人数、90 分以上人数
- 导出到 Excel:计算各个课程的学生成绩排名,并导出到 Excel 文件对应的 Sheet 中
- 还原修改:还原尚未保存的修改,防止误操作
- 输入输出的要求
- 通过键盘输入各学生的多门课程的成绩,建立相应的文件 input.dat
- 按各门课程成绩排序,并生成相应的文件输出
- 计算每人的平均成绩,按平均成绩排序,并生成文件
- 求出各门课程的平均成绩、最高分、最低分、不及格人数、60-69 分
-
人数、70-79 分人数、80-89 分人数、90 分以上人数
-
-
- 根据姓名或学号查询某人的各门课成绩,重名情况也能处理
- 涉及到的知识点
-
Qt5,SQLite 数据库,BasicExcel,链表、红黑树等数据结构二、 概要设计
- qt 架构概览
- MVC 模式
UI 界面层(view)——>控制器层:当用户操作 UI 界面时,发射一个控制器层信号;
控制器层(controller)——>模型层:控制层调用模型层功能函数,实现对应业务逻辑功能;
模型层(model)——>控制器层:模型功能层,完成业务逻辑后,再发射一个控制器层信号,声明完成了该业务逻辑功能。
控制器层(controller)——>UI 界面层:控制器层接收到该支线程完成了对应的业务逻辑,开启槽函数结束该支线程,然后发射一个控制器层完成业务逻辑信号到 UI 界面层。UI 界面层收到信号,显示对应的结果 UI 界面。
注意:整个过程控制器有三个关键信号,启动业务逻辑功能信号,退出该业务逻辑线程信号,完成业务逻辑信号。而 model 层功能函数是用支线程来执行。也就是说,所有的模型功能函数都是用支线程完成,这样可以保证 UI 界面的流畅度。起源于 smalltalk 的一种与用户界面设计相关的设计模式。
作用:有效的分离数据和用户界面。
组成:模型 model(表示数据)、视图 view(表示用户界面)、控制 controller
(定义用户在界面上的操作)。
-
- interView 框架Qt 的 MVC
区别:将视图与控制结合在一起,同时添加了代理 delegate 能够自定义数据条目 item 的显示与编辑方式。
组成:模型 model(表示数据)、视图 view(表示用户界面)、代理 delegate(自定义数据条目 item 的显示与编辑方式)。
-
- 模型与视图结构模型与数据通信,并提供接口
视图从模型中获取数据条目索引代理绘制数据条目
通信方式:信号&槽
工作过程:
数据改变时,模型发出信号通知视图; 用户对界面操作时,视图发出信号;
代理发出信号告知模型和视图编辑器目前的状态;
-
- 模型 model(表示数据) 抽象基类 QAbstractItemModel
列表的抽象基类 QAbstractListModel、表格的抽象基类 QAbstractTableModel QDirModel 类是文件与目录的存储模型
QStandardItemModel 类QStringListModel 类
-
- 视图 view(表示用户界面) 抽象基类 QAbstractItemView QListView—QListWidget\QUndoView QTableView—QTableWidget QTreeView—QTreeWidget
QColumnView QHeaderView
实际上:QListWidget、QTableWidget、QTreeWidget 已经包含数据,是模型与视图集成的类
-
- 代理 delegate(自定义数据条目 item 的显示与编辑方式) 抽象基类 QAbstractItemDelegate QItemDelegate/QStyleItemDelegate
类 QItemDelegate 由类 QSqlRelationDelegate 继承
- 模块组成
- QMainWindow
主窗口提供了构建应用程序用户界面的框架。Qt 有 QMainWindow 及其相关的主窗口管理类。QMainWindow 有自己的布局,您可以向其中添加 QToolBar、QDockWidget、QMenuBar 和 QStatusBar。布局有一个中心区域,可以被任何类型的小部件占据。您可以在下面看到布局的图像
- QTableView
QTableView 实现了一个表视图,显示模型中的项目。此类用于提供以前由QTable 类提供的标准表,但使用 Qt 的模型/视图体系结构提供的更灵活的方法。
QTableView 类是模型/视图类之一,是 Qt 模型/视图框架的一部分。QTableView 实现了由 QAbstractItemView 类定义的接口,以允许它显示由派生自 QAbstractItemModel 类的模型提供的数据。
- QSQLTableModel->QAbstractTableModel
QSqlTableModel 是一个高级接口,用于从单个表读取和写入数据库记录。它建立在较低级别的 QSqlQuery 之上,可用于提供数据以查看 QTableView 等类。例如:我们设置 SQL 表的名称和编辑策略,然后我们设置显示在视图标题中的标签。编辑策略指示用户在视图中所做的更改何时实际应用到数据库。可能的值为OnFieldChange、OnRowChange 和 OnManualSubmit。
QSqlTableModel 还可以用于以编程方式访问数据库,而无需将其绑定到视图: 可以使用 setFilter () 设置过滤器,或者使用 setSort ()修改排序顺序。最后,必须调用 select () 以使用数据填充模型。
tablemodel 示例说明了如何使用 QSqlTableModel 作为 QTableView 的数据源。QSqlTableModel 不 直 接 支 持 外 键 。 如 果 要 解 析 外 键 , 使 用QSqlRelationalTableModel 和 QSqlRelationalDelegate 。
QAbstractTableModel 为将数据表示为二维项目数组的模型提供了一个标准接口。它不能直接使用,但必须是子类。
由于该模型提供了比 QAbstractItemModel 更专门的接口,因此它不适合与树视
图一起使用,尽管它可以用于向 QListView 提供数据。如果您需要表示一个简单的项目 列表 , 并 且 只需要 一个 模型 来 包含一 个数 据列 , 那么继承QAbstractListModel 可能更合适。
rowCount()和 columnCount()函数返回表的维度。要检索与模型中的项对应的模型索引,使用 index()并只提供行号和列号。
- QPushButton
按钮或命令按钮可能是任何图形用户界面中最常用的小部件。按下(单击)按钮以命令计算机执行某些操作或回答问题。典型的按钮有确定、应用、取消、关闭、是、否和帮助。
命令按钮是矩形的,通常显示描述其操作的文本标签。可以通过在文本中的首选字符前加上一个符号来指定快捷键。
按钮显示一个文本标签,以及一个可选的小图标。这些可以使用构造函数设置, 稍后使用 setText () 和 setIcon () 进行更改。如果按钮被禁用,文本和图标的外观将根据 GUI 样式进行操作,使按钮看起来“已禁用”。
按钮在被鼠标、空格键或键盘快捷键激活时会发出 clicked () 信号。连接到此信号以执行按钮的操作。按钮还提供不太常用的信号,例如按下() 和释放()。对话框中的命令按钮在默认情况下是自动默认按钮,即它们在接收到键盘输入焦点时自动成为默认按钮。默认按钮是当用户在对话框中按下 Enter 或 Return 键时激活的按钮。您可以使用 setAutoDefault ()更改此设置。请注意,自动默认按钮会保留一些额外的空间,这是绘制默认按钮指示器所必需的。
- 数据结构
- QVector 动态数组-顺序容器
QVector<T> 是 Qt 的通用容器类之一。它将其项目存储在相邻的内存位置,并提供快速的基于索引的访问。
QList <T>、QLinkedList<T>、QVector<T> 和 QVarLengthArray <T> 提供类似的 API 和功能。它们通常可以互换,但会影响性能。
QVector 应该是默认的首选。QVector<T> 通常会比 QList <T> 提供更好的性能,因为 QVector<T> 总是将其项目按顺序存储在内存中,其中 QList <T> 将在堆上分配其项目, 除非 sizeof(T) <= sizeof(void*)T 已被声明为Q_MOVABLE_TYPE 或 Q_PRIMITIVE_TYPE 使用 Q_DECLARE_TYPEINFO。
但是,QList 在整个 Qt API 中用于传递参数和返回值。使用 QList 与这些 API 交互。
如果需要一个真正的链表,它保证恒定时间插入中间列表并使用迭代器而不是索引,需要使用 QLinkedList。
QVector 和 QVarLengthArray 都保证 C 兼容的数组布局。QList 没有。如果的应用程序必须与 C API 交互,这可能很重要。
只要引用的项保留在容器中,QLinkedList 中的迭代器和堆分配 QList 中的引用就保持有效。对于 QVector 和非堆分配 QList 的迭代器和引用来说,情况并非如此。
- QMap 红黑树字典
QMap<Key, T> 是 Qt 的通用容器类之一。它存储 (key, value) 对并提供与键关联的值的快速查找。
QMap 和 QHash 提供非常相似的功能。不同之处在于: QHash 提供比 QMap 平均更快的查找。
迭代 QHash 时,项目是任意排序的。使用 QMap,项目总是按键排序。
QHash 的键类型必须提供 operator==() 和一个全局的 qHash (Key) 函数。QMap 的键类型必须提供 operator<() 指定总顺序。从 Qt 5.8.1 开始,使用指针类型作为键也是安全的,即使底层的 operator<() 不提供全序。
- 数据库
实际项目中通常采用各种数据库(如 Oracle、SQL Server、MySQL 等)来实现对数据的存储、检索等功能。这些数据库除了提供基本的查询、删除和添加等功能外,还提供很多高级特性,如触发器、存储过程、数据备份恢复和全文检索功能等。但实际上很多应用仅利用了这些数据库的基本特性,而且在某些特殊场合的应用中,这些数据库明显显得有些臃肿。
Qt5 提供了一种进程内数据库 SQLite。它是一个轻量级的数据库。没有其他依赖,
可以应用于多种操作系统平台。概括下来具有以下优点:
- SQLite 的设计目的是嵌入式 SQL 数据库引擎,它基于纯 C 语言代码,已经应用到非常广泛的领域内。
- SQLite 在需要持久存储时直接读写硬盘的数据文件,在无需持久存储时也可以将整个数据库置于内存中,两者均不需要额外的服务器端进程,即 SQLite 是无须独立运行的数据库引擎。
- 开放源代码,整个代码少于三万行,有良好的注释和 90%以上的测试覆盖率。
- 少于 250KB 的内存占用(gcc 编译情况下)。
- 支持视图、触发器和事务,支持嵌套 SQL 功能。
(6)不需要配置,不需要安装,也不需要管理员。
(7)编程接口简单易用。
(8)大部分应用的速度比目前常见的客户端、服务器结构的数据库快。
- 提供虚拟机用于处理 SQL 语句。
student 表结构: id,主键、唯一、非空,类型:varchar(255),表示学号name,非空,类型:varchar(255),表示姓名 math,非空,类型:double,表示高数成绩 enlish,非空,类型:double,表示英语成绩 compute,非空,类型:double,表示计算机导论成绩average,非空,类型:double,表示平均成绩
-
- 各函数的调用关系图、主要函数的流程图
关键调用时序图
- 程序调试中遇到的问题以及解决问题的方法
- 如何配置 CLion 作为 Qt5 开发环境
- 创 建 项 目 并 指 定 Qt CMake prefix path 为 Qt 安 装 路 径 下 的E:\Qt\Qt5.9.1\5.9.1\mingw53_32
- 配置编译工具链
- 添加外部工具,找到 Setting——>Tool——>External Tools 创建 Tool 添加 Qt Designer,用于打开*.ui 文件
添加 Qt UIC,用于生成 ui_qwmainwind.h 文件
- 运行,成功。
- 创建 UI 类
- 生成 ui_MainWind.h 文件
打开 mainwind.cpp 可以看到引入头文件#include "ui_MainWind.h"报错,在注释中给我们提示了需要使用 Qt uic 来生成 ui_MainWind.h,我们之前添加的外部工具就是用来生成它的。
鼠标右键 mainwind.ui,使用 QtDesigner 打开
然后就可以使用 Qt Designer 进行可视化设计和布局然后使用 Qt uic 生成代码
此时可以发现目录文件夹下多了 ui_MainWind.h 文件
然后再运行就成功啦!
- Qt GUI 主题看起来很过时CMakeLists.txt 末尾添加
- Qt 创建右键菜单
方法 1
该方法是触发 contextMenuEvent 事件来实现右键菜单,只需在该事件函数中写入对应的右键菜单代码即可。
方法 2
该方法是通过控件发出的 customContextMenuRequested 信号触发对应的槽函数实现,同样需要添加对应的右键菜单代码。
方法区分:
当在函数中并未使用 setContextMenuPolicy 函数设置对应值时,右键操作通常会触发 contextMenuEvent 事件;反之使用 setContextMenuPolicy 函数将值设置为 Qt::CustomContextMenu 时,才会发出对应的信号。
因为 QWidget 包含该信号和该事件,理论上说,只要继承了 QWidget 都能通过这两种方法实现右键菜单。
方法 1 适用于整个界面大部分的右键菜单相同时使用;方法 2 则适用于窗口中只有部分控件包含右键菜单或不同的右键菜单的情况;如示例图一样,在tableview 中的右键菜单和在窗口其他位置点击的右键菜单不同一样。
右键菜单其实也可以通过鼠标事件实现,并且其使用方法和方法 1 类似,不过需要判断鼠标按钮。
值得一提的是当点击右键菜单中的选项时,会发出 triggered 信号,可通过该信号连接槽函数做出对应的操作,在添加右键菜单项的时候也可设置槽函数等。
- Qt 操作数据库报错:QSqlDatabase: QSQLITE driver not loaded 在解决了 Clion + Qt 的数据库问题后《Clion + Qt 添加 SQLite 数据库》,又遇到了新的问题,在运行程序时,出现 QSqlDatabase: QSQLITE driver not loaded 错误
qDebug() << "sql drivers" << QSqlDatabase::drivers(); 使用下面语句输出支持的数据库,会输出空
首先,去 Qt 的安装路径下,进入 plugins 文件夹E:\Qt\Qt5.14.2\5.14.2\mingw73_64\plugins
找到 sqldrivers 文件夹,直接把这个文件夹拷贝到可执行程序的路径下。不是在工程目录下,(当然,不同环境可能也有差异)比如这里使用的是 Clion 编写的 Qt 程序,路径就是 cmake-build-debug 下
再次运行,那条语句就会输出(因为只保留了 qsqlite.dll 文件)
- QT 控件大小自适应窗口变化
问题:刚开始学习 QT 时,在窗口中放置一个个控件,而后运行程序。会发现改变窗口大小时,控件大小不随窗口大小变化而变化,导致窗口大小变化没意义, 同时也让精心布局看起来很难看。
本文提供一种使用 BoxLayout 中放置控件,所有可见控件能够随窗口大小变化同比例变化的方法。
主要思想:在窗口中首先放置 BoxLayout 控件,再在 BoxLayout 控件中放置可视的控件。
- QtableWidget 表格列宽自适应表格大小
在 groupBox 中添加了一个 QtableWidget,即表格组件。这个表格只有 5 列,只占据了表格的一部分,不是很好看。
核心代码如下,最重要的是最后一句,让标题栏自适应大小。
taskListTable->horizontalHeader()->setSectionResizeMode(QHeaderView:: Stretch);
接下来解释一下这个函数,horizontalHeader 返回的是表格的垂直行标题,也就是第一行标题栏。这是个特殊的类,叫 QHeaderView 类。对标题栏进行调整, 往往就是对这个类进行调整。
setSectionResizeMode 函数是上述类的一个函数,设置标题如何调整为给定模式所描述的大小。
QHeaderView::ResizeMode 就是模式的枚举量,主要就是调整标题栏大小,即列宽。存在以下的取值:
QHeaderView::Interactive 用 户 可 以 手 动 调 节 列 宽 , 也 可 以 通 过 调 用resizeSection 函数调整。
QHeaderView::Fixed 用户无法手动调整列宽,只能调用 resizeSection 函数调整。
QHeaderView::Stretch 列宽会自动调节以填充可用空间。大小不能由用户更改或以编程的方式更改。
QHeaderView::ResizeToContents 列宽会自动根据内容调整为最佳大小。大小不能由用户更改或以编程的方式更改。
- C++操作 Excel
在深入研究之前 BasicExcel,让我们先看看它的局限性。它被称为 BasicExcel 是有原因的。
不支持格式化它不支持公式它不支持图表
它不支持 Unicode UTF-32 它不支持...
实际上它不支持 Excel 的许多奇特功能。它旨在成为一个基本类,用于将数字和字符串等简单内容读写到电子表格中。因此,最好列出它支持的内容。
读写数字(整数、实数)和字符串(ANSI、UTF16) 添加工作表
重命名工作表删除工作表
获取工作表的名称
就是这样。如您所见,BasicExcel 它确实很基础,但即使以目前的形式,它也比 CSpreadSheet. 然而,虽然它的功能是基本的,但编程并不基本。读写复合文件,读写原生 Excel 格式,需要大量代码。因此,总行数 BasicExcel 超过 6000。类 BasicExcel
类 BasicExcelWorksheet 类 BasicExcelCell
- Qt 操作 SQLite 数据库
Qt SQL 模块使用驱动程序插件(plugins)与不同的数据库 API 进行通信。由于Qt 的 SQL 模块 API 与数据库无关,因此所有特定于数据库的代码都包含在这些驱动程序中。Qt 提供了几个驱动程序,也可以添加其他驱动程序。提供驱动程序源代码,可用作编写自己的驱动程序的模型。
QtCreator 在*.pro 中引入 sql 模块(QT+=sql),或是 VS 中在 Qt VS Tool 里勾选上 sql 模块,就可以使用该模块的接口了。
可以使用 QSqlDatabase::drivers()获取驱动程序列表并打印
其中,SQLite 是一个进程内数据库,这意味着没有必要拥有数据库服务器。SQLite 在单个文件上运行,在打开连接时必须将其设置为数据库名称。如果该文件不存在,SQLite 将尝试创建它。
先是创建了一个 QSqlDatabase 对象,该类用于处理数据库的连接。contains 方法用于查看给定的连接名称是否在连接列表中,database 方法获取数据库连接, 前提是已使用 addDatabase 添加数据库连接。
第一个参数对应驱动名,第二个参数为连接名称 ,如果不使用默认连接名称“qt_sql_default_connection”的话需要填写该参数。
设置了驱动及连接名称后,就是设置数据库文件的名称/路径,因为 SQLite 不需要用户名和密码,接下来直接就可以通过 open 和 close 函数来打开关闭该数据库了。
此外, 如果需要在内存中创建数据库, 而不是指定一个文件, 可以setDatabaseName(":memory:");
SQL 语句执行需要用到 QSqlQuery 类,文档有云:
QSqlQuery 封装了在 QSqlDatabase 上执行的 SQL 查询中创建,导航和检索数据所涉及的功能。它可以被用来执行 DML(数据操纵语言)语句,例如 select、insert、update、delete,以及 DDL(数据定义语言)语句,如 create table, 还可以用于执行非标准 SQL 的特定于数据库的命令。
成功执行的SQL 语句将查询的状态设置为活动状态,以便isActive()返回true。否则,查询的状态将设置为非活动状态。在任何一种情况下,执行新的 SQL 语句时,查询都位于无效记录上。必须先将活动查询导航到有效记录(以便 isActive() 返回 true),然后才能检索值。
代码通过 QSqlQuery 的 exec 方法执行 SQL 语句,创建了一个简单的数据表。exec 执行 SQL 语句成功返回 true,否则返回 false。
QSqlQuery 的构造函数可以指定 QDatabase 参数,如果未指定 db,或者 db 无效将使用默认连接。
要注意的是,对于 SQLite,exec 方法一次只能执行一个语句。
执行了上面的操作且数据库已 open,就能使用 QSqlQuery 的 exec 方法来完成增删改查了。
可以看到,如果熟悉 SQL 语句的话,很容易就实现了增删改查功能。
对于 BLOB 类型,查询后可以 toByteArray,修改时可以 bindValue QByteArray。
有时候会遇到大量数据操作的情况,这时候用普通的 insert 之类的语句循环操作可能会很慢。
技巧一:开启事务
SQLite 通过执行"BEGIN;" 或是"BEGIN TRANSACTION;" 开启事 务, 执行"ROLLBACK;"进行回滚,执行"COMMIT;"或是"END TRANSACTION;"提交事务。
QSqlDatabase 也提供了对应的 transaction、rollback、commit 三个函数来执行对应操作。
技巧二:关闭写同步(synchrnous)
在 SQLite 中,数据库配置的参数都由编译指示(pragma)来实现的,而其中synchronous 选项有三种可选状态,分别是 full、normal、off。简要说来,full 写入速度最慢,但保证数据是安全的,不受断电、系统崩溃等影响,而 off 可以加速数据库的一些操作,但如果系统崩溃或断电,则数据库可能会损毁。通过执行"PRAGMA synchronous = OFF;"语句,可以提升效率,不过若不是临时数据库不建议此操作。
- QTableWidget 控件基本操作
QTableWidget 是 QT 中的表格组件类。一般用来展示多行多列的数据,是 QT 中使用较多的控件之一。
1、QTableWidgetItem 对象
QTableWidget 中的每一个单元格都是一个 QTableWidgetItem 对象,因此先介绍下 QTableWidgetItem 的常用方法。
1.1、设置文本内容
void QTableWidgetItem::setText(const QString &text) 1.2、设置对齐方式
void QTableWidgetItem::setTextAlignment(int alignment) 1.3、设置单元格背景色
void QTableWidgetItem::setBackground(const QBrush &brush) 1.4、设置单元格显示图标
void QTableWidgetItem::setIcon(const QIcon &icon) 1.5、设置单元格字体
void QTableWidgetItem::setFont(const QFont &font) 1.6、获取单元格文本内容