Qt数据库总结
qt课程设计实训小结
qt课程设计实训小结一、教学目标本课程的教学目标是使学生掌握Qt课程设计的基本知识和技能,能够独立完成Qt应用程序的设计与开发。
具体目标如下:1.理解Qt的基本概念和架构。
2.掌握Qt应用程序的设计流程。
3.熟悉Qt常用的类和接口。
4.了解Qt的事件处理机制。
5.能够使用Qt Creator进行应用程序的开发。
6.能够使用Qt Widgets进行图形用户界面的设计。
7.能够使用Qt的信号与槽机制进行事件处理。
8.能够使用Qt的数据库功能进行数据存储和检索。
情感态度价值观目标:1.培养学生的创新意识和解决问题的能力。
2.培养学生的团队协作精神和沟通能力。
3.培养学生的自主学习和持续学习的习惯。
二、教学内容本课程的教学内容主要包括以下几个部分:1.Qt的基本概念和架构:Qt是什么,Qt的优点和缺点,Qt的版本和安装,Qt的模块和类。
2.Qt应用程序的设计流程:Qt Creator的使用,项目创建和管理,应用程序的框架结构,主窗口的设计和实现。
3.Qt Widgets的使用:按钮、文本框、标签、对话框等控件的使用,布局管理器的设计,工具栏和菜单的设计。
4.Qt的信号与槽机制:信号与槽的概念,信号与槽的连接,自定义信号与槽,信号与槽的运用。
5.Qt的数据库功能:数据库的基本概念,Qt对数据库的支持,数据库连接的建立和关闭,SQL语句的执行,数据模型的使用。
三、教学方法本课程的教学方法主要包括以下几种:1.讲授法:通过讲解和演示,使学生掌握Qt的基本概念和架构,以及应用程序的设计流程。
2.讨论法:通过小组讨论,使学生深入理解Qt的信号与槽机制和数据库功能。
3.案例分析法:通过分析典型案例,使学生掌握Qt Widgets的使用和事件处理。
4.实验法:通过上机实验,使学生熟练掌握Qt Creator的使用和应用程序的开发。
四、教学资源本课程的教学资源主要包括以下几种:1.教材:《Qt课程设计实训》。
2.参考书:《Qt 5.12官方文档》、《Qt Creator用户手册》。
qt实训日志
qt实训日志一、前言本篇文章是我在QT实训期间的日志记录,主要记录了我在学习和实践中的思考和收获,以及遇到的问题和解决方法。
二、学习内容1. QT基础知识在开始实训之前,我们首先学习了QT的基础知识,包括QT的安装、界面设计、信号与槽机制等。
其中,信号与槽机制是QT最重要的特性之一,它可以将不同对象之间的交互行为进行解耦,使得代码更加清晰和易于维护。
2. QT网络编程随着互联网技术的发展,网络编程已经成为了一项非常重要的技能。
在QT实训中,我们也学习了QT网络编程相关知识,包括TCP/IP协议、Socket编程等。
通过这些知识的学习和实践,我们能够更加深入地理解网络编程的本质,并且能够独立完成基本的网络应用开发。
3. QT数据库开发数据库是现代软件开发中不可或缺的一部分。
在QT实训中,我们也学习了QT数据库开发相关知识,并且使用SQLite作为数据库进行实践。
通过这些知识的学习和实践,我们能够更加深入地了解数据库的设计和使用,以及如何在QT中进行数据库操作。
三、实践项目1. 聊天室聊天室是我们在QT实训中完成的第一个项目。
通过这个项目,我们学习了QT网络编程相关知识,并且实现了一个基本的聊天室应用。
在这个项目中,我们使用了TCP/IP协议进行通信,并且使用了QT的信号与槽机制来处理用户输入和服务器响应。
2. 学生成绩管理系统学生成绩管理系统是我们在QT实训中完成的第二个项目。
通过这个项目,我们学习了QT数据库开发相关知识,并且实现了一个基本的学生成绩管理系统。
在这个项目中,我们使用了SQLite作为数据库,并且使用了QT的模型/视图框架来显示数据。
3. 图书馆管理系统图书馆管理系统是我们在QT实训中完成的第三个项目。
通过这个项目,我们进一步深入地学习了QT数据库开发相关知识,并且实现了一个复杂的图书馆管理系统。
在这个项目中,我们不仅使用了SQLite 作为数据库,还使用了多线程编程来提高程序性能。
QT与SQLite数据库学习资料
当然我们一定要记住这个顺序,先创建数据库,然后再去创建一个表(作为菜鸟的我犯这个错误了),还有一点需要注意的红色标记的那句话,我参考的数籍一般都这样写db.setDatabaseName(":memory:");这样就把生成的数据库文件是在内存当中的,在工程文件目录下找不到。
上面使我们创建了一个数据库和一个表,那么我们如何把它呈现在我们的QTableview部件上呢?QSqlTableModel *model = new QSqlTableModel;model->setTable("person");model->setEditStrategy(QSqlTableModel::OnManualSubmit);model->select();ui->tableView->setModel(model);ui->tableView->show();上面的代码就把数据库中的信息不加筛选的打印到控件上了。
第一次写博客大家多多包涵。
Qt中提高sqlite的读写速度SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。
例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行query.exec("insert into DataBase(......)values(......)");就会打开和关闭文件100万次,所以速度当然会很慢。
SQLite 数据库是支持事务操作的,于是我们就可以通过事务来提高数据库的读写速度。
事务的基本原理是:数据库管理系统首先会把要执行的sql语句存储到内存当中,只有当commit()的时候才一次性全部执行所有内存中的数据库。
下面是一个简单的QT sqlite数据库事务的例子:#include <QtCore/QCoreApplication>#include <QtSql>#include <iostream>using namespace std;int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QSqlDatabase db_sqlite = QSqlDatabase::addDatabase("QSQLITE", "connSQLite");db_sqlite.setDatabaseName("SQLiteDB.db3");db_sqlite.open();QSqlQuery query("", db_sqlite);bool bsuccess = false;QTime tmpTime;// 开始启动事务db_sqlite.transaction();tmpTime.start();for(int i = 0; i<100000; i++){bsuccess = query.exec("insert into DataBase(D_1,D_2,D_3,D_4,D_5) values('TT','TT','TT','TT','TT')");if (!bsuccess){cout<<"Error occur"<<endl;break;}}// 提交事务,这个时候才是真正打开文件执行SQL语句的时候db_mit();cout<<"10000条数据耗时:"<<tmpTime.elapsed()<<"ms"<<endl;}其实QT 操作sqlite数据库增加事务的功能就是上面例子中蓝色字体标出的两句话,如果去掉这两句话,程序又会还原为:打开文件——执行query.exec(...)——关闭文件。
qt项目报告总结
Qt项目报告总结一、项目概述本项目旨在开发一款基于Qt框架的桌面应用程序,用于实现用户与计算机之间的交互操作。
通过Qt的各种组件和类库,我们成功地构建了一个功能丰富、界面美观的应用程序,满足了用户的需求。
二、开发环境与工具我们使用Qt Creator作为集成开发环境,利用C++语言进行开发。
在开发过程中,我们使用了Qt的各种核心组件,如QWidget、QPushButton、QLabel等,以构建用户界面。
同时,我们还使用了Qt 的信号与槽机制,实现了事件处理和数据传递。
三、项目实施过程1.需求分析:首先,我们对项目需求进行了深入的分析,明确了项目的目标和功能需求。
我们确定了应用程序需要具备的基本功能,如窗口管理、用户输入处理、数据存储等。
2.设计阶段:根据需求分析的结果,我们进行了详细的设计工作。
我们设计了应用程序的界面布局、功能模块以及各个模块之间的通信方式。
同时,我们还制定了开发计划和时间表。
3.编码阶段:在编码阶段,我们按照设计要求,逐步实现了各个功能模块。
我们利用Qt的各种组件和类库,编写了相应的代码。
在编写过程中,我们注重代码的规范性和可读性,以确保代码质量。
4.测试阶段:在测试阶段,我们对应用程序进行了全面的测试。
我们进行了单元测试、集成测试和系统测试,以确保应用程序的稳定性和功能性。
同时,我们还根据测试结果对代码进行了优化和调整。
5.部署与维护:最后,我们将应用程序部署到了目标平台上,并对用户进行了培训和技术支持。
在应用程序运行过程中,我们持续关注用户反馈,及时修复了潜在的问题和缺陷。
四、项目成果与收获通过本次Qt项目的开发,我们取得了以下成果和收获:1.成功构建了一个功能丰富、界面美观的桌面应用程序,满足了用户的需求。
2.熟练掌握了Qt框架的核心组件和类库,提高了我们的编程技能和经验。
Qt数据库操作
3.修改main.cpp中的内容如下。 #include <QtCore/QCoreApplication> #include <QtSql> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”); //添加数据库驱动 db.setDatabaseName(“:memory:”); //数据库连接命名 if(!db.open()) //打开数据库 { return false; } QSqlQuery query; //以下执行相关QSL语句 query.exec(“create table student(id int primary key,name varchar)”); //新建student表,id设置为主键,还有一个name项 query.exec(“insert into student values(1,’xiaogang’)”); query.exec(“insert into student values(2,’xiaoming’)”); query.exec(“insert into student values(3,’xiaohong’)”); //向表中插入3条记录 query.exec(“select id,name from student where id >= 2″); //查找表中id >=2 的记录的id项和name项的值 while(query.next()) //query.next()指向查找到的第一条记录,然后每次后移一条记录 { int ele0 = query.value(0).toInt(); //query.value(0)是id的值,将其转换为int型 QString ele1 =query.value(1).toString(); qDebug() << ele0 <<ele1 ; //输出两个值 } } return a.exec();
qt 操作 数据库addbindvalue select语句
qt 操作数据库addbindvalue select语句Qt是一个功能强大的C++应用程序开发框架,它提供了一套数据库操作接口,方便我们在应用程序中使用数据库进行数据的存储和查询。
其中,addBindValue函数和select语句是我们常用的数据库操作函数和语句之一。
在本文中,我将详细介绍如何使用addBindValue函数和select语句实现数据库的查询操作。
首先,让我们来了解一下addBindValue函数的作用和用法。
addBindValue函数是Qt提供的一个用于绑定参数的函数,它可以将参数值绑定到SQL语句中的占位符,以防止SQL注入攻击,并且可以更方便地处理不同数据类型的参数。
在使用addBindValue函数时,我们可以直接将参数值作为函数的参数传入,同时还可以使用占位符的方式进行参数的绑定,例如":name"。
下面是addBindValue函数的基本用法:cppQSqlQuery query;query.prepare("SELECT * FROM table WHERE name = ?"); query.addBindValue("John");query.exec();在上述示例中,我们首先创建了一个QSqlQuery对象query,并使用prepare函数准备了一个SQL语句,其中使用了一个占位符"?"。
接着,我们使用addBindValue函数将参数值"John"绑定到了占位符上,并最后使用exec函数执行SQL语句。
接下来,我们将使用addBindValue函数和select语句结合起来,实现一个完整的数据库查询操作。
在此之前,我们需要先创建一个数据库连接,并打开一个数据库。
具体的数据库连接和打开操作可以参考Qt官方文档中的相关章节。
假设我们的数据库中有一个名为"employees"的表,该表包含了姓名(name)、年龄(age)和职位(position)三个字段,我们需要根据员工的姓名进行查询操作。
qt sqlite 数组
qt sqlite 数组
在Qt中使用SQLite数据库存储数组需要一些特殊的处理方法。
SQLite本身并不直接支持数组类型,但可以通过将数组转换为字符
串存储在数据库中,或者使用多个表来模拟数组的存储。
一种常见的方法是将数组转换为逗号分隔的字符串,然后将其
存储在数据库的一个字段中。
在读取数据时,再将字符串分割为数组。
这种方法简单直接,但需要在应用程序中进行字符串和数组的
转换操作。
另一种方法是使用多个表来模拟数组的存储。
例如,可以创建
一个主表存储数组的其他属性,然后创建一个关联表来存储数组的
元素,通过外键关联两个表。
这种方法需要更多的表设计和数据库
操作,但能更好地支持数组的增删改查操作。
在Qt中操作SQLite数据库,可以使用Qt提供的QtSql模块。
首先需要使用QSqlDatabase来连接数据库,然后执行SQL语句来创
建表、插入数据、查询数据等操作。
对于数组的存储和操作,可以
通过QString来表示数组,并在应用程序中进行字符串和数组的转
换操作,或者通过多个表来模拟数组的存储。
总之,在Qt中使用SQLite存储数组需要根据具体的需求和数据结构选择合适的方法,然后通过QtSql模块来操作数据库实现相应的功能。
希望这些信息能对你有所帮助。
Qt 5开发及实例 第13章 Qt 5数据库
1.SELECT语句
(9)IN子查询。查找选修了课程号为101的学生情况。
SELECT * FROM students WHERE studentid IN ( SELECT studentid FROM courses WHERE courseid = '101' )
在执行包含子查询的SELECT语句时,系统首先执行子查询,产生一个结果表,再执行外查询。本例中, 首先执行子查询:
/* IN子句 */
| expression { = | < | <= | > | >= | <> | != | !< | !> } { ALL | SOME | ANY } ( subquery )
/* 比较子查询 */
| EXIST ( subquery )
/* EXIST子查询 */
}
1.SELECT语句
第13章 Qt 5数据库
——数据库基本概念
1.数据和数据库(DB)
利用计算机进行数据处理,首先需要将信息以数据形式存储到计算机中,因为数据是可以被 计算机接收和处理的符号。根据所表示的信息特征不同,数据有不同的类别,如数字、文字、表 格、图形/图像和声音等。
数据库(DataBase,DB),顾名思义,就是存放数据的仓库,其特点是:数据按照数据模型 组织,是高度结构化的,可供多个用户共享并且具有一定的安全性。
SELECT studentid FROM courses, students,grades WHERE courseid = '101' AND students.studentid = grades.studentid AND courses.courseid = grades.coursesid
qt 基础知识梳理
qt 基础知识梳理QT基础知识梳理QT是一种跨平台的C++应用程序开发框架,通过QT,开发者可以方便地编写可在不同操作系统上运行的应用程序。
本文将梳理一些QT的基础知识,帮助读者了解QT的核心概念和常用功能。
一、QT概述QT是由挪威的Trolltech公司开发的一种C++应用程序开发框架,其目标是提供一种简单、易用、跨平台的开发环境。
QT采用了一种特殊的信号与槽机制,使得开发者可以方便地处理对象之间的事件和通信。
QT还提供了丰富的图形界面控件和工具类,以及强大的跨平台支持,使得开发者可以快速地开发出高质量的应用程序。
二、QT的核心概念1. 对象和类:在QT中,所有的组件都是对象,对象是类的实例。
类定义了对象的属性和行为,开发者可以通过继承和多态等方式来扩展和定制类的功能。
2. 信号与槽机制:信号与槽是QT的核心机制,它通过一种松耦合的方式实现了对象之间的通信。
一个对象可以发送信号,而其他对象可以接收这个信号并作出相应的反应。
开发者可以通过connect 函数将信号和槽函数连接起来,实现对象之间的交互。
3. 事件驱动编程:QT采用了事件驱动的编程方式,当用户执行某个操作时,系统会生成相应的事件,然后QT会将事件发送给相关的对象,对象再根据事件的类型和参数来执行相应的操作。
4. 常用的QT类:QT提供了丰富的类库,包括图形界面控件、文件操作、网络通信、数据库访问等功能。
常用的类有QWidget、QLabel、QPushButton、QLineEdit、QSpinBox等,开发者可以根据自己的需求选择合适的类来构建界面和实现功能。
三、QT的常用功能1. 图形界面开发:QT提供了丰富的图形界面控件和布局管理器,开发者可以通过拖拽和设置属性的方式来构建界面。
同时,QT还提供了强大的绘图和动画功能,可以实现各种复杂的图形效果。
2. 事件处理:QT中的事件可以分为系统事件和自定义事件。
系统事件包括鼠标点击、键盘输入等用户操作,开发者可以通过重写事件处理函数来响应这些事件。
二十五、Qt数据库(五)QSqlQueryModel
二十五、Qt数据库(五)QSqlQueryModel本文章原创于转载请注明出处。
在上一篇的最后我们说到,Qt中使用了自己的机制来避免使用SQL语句,它为我们提供了更简单的数据库操作和数据显示模型。
它们分别是只读的QSqlQueryModel,操作单表的QSqlTableModel和以及可以支持外键的QSqlRelationalTableModel。
这次我们先讲解QSqlQueryModel。
QSqlQueryModel类为SQL的结果集提供了一个只读的数据模型,下面我们先利用这个类进行一个最简单的操作。
我们新建Qt4 Gui Application工程,我这里工程名为queryModel ,然后选中QtSql 模块,Base class选QWidget。
工程建好后,添加C++ Header File ,命名为database.h,更改其内容如下:#ifndef DATABASE_H#define DATABASE_H#include <QSqlDatabase>#include <QSqlQuery>static bool createConnection(){QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);db.setDatabaseName(“database.db”);if(!db.open()) return false;QSqlQuery query;query.exec(“create table student (id int primary key, name vchar)”);query.exec(“insert into student values (0,’yafei0′)”);query.exec(“insert into student values (1,’yafei1′)”);query.exec(“insert into student values (2,’yafei2′)”);return true;}#endif // DATABASE_H这里我们使用了db.setDatabaseName(“database.db”);,我们没有再使用以前的内存数据库,而是使用了真实的文件,这样后面对数据库进行的操作就能保存下来了。
qt数据库原子操作方法
qt数据库原子操作方法(原创版3篇)目录(篇1)1.引言2.Qt数据库原子操作方法3.原子操作的概念和重要性4.Qt数据库中原子操作的应用5.结论正文(篇1)一、引言在软件开发中,数据库操作是必不可少的一部分。
为了确保数据的安全性和完整性,原子操作被广泛应用于数据库管理系统中。
Qt作为一个流行的C++开发框架,也提供了原子操作方法,以便更好地管理数据库。
二、Qt数据库原子操作方法原子操作是一种确保数据库操作要么完全执行,要么不执行的机制。
在Qt中,可以使用QAtomicInt和QAtomicBool等类来实现原子操作。
这些类提供了原子增加、减少、设置等操作,确保在多线程环境下的数据一致性和完整性。
三、原子操作的概念和重要性原子操作是一种不可分割的操作,要么全部执行,要么不执行。
在数据库管理系统中,原子操作非常重要,它可以确保数据的安全性和完整性。
如果不使用原子操作,那么在多线程环境下的数据操作可能会发生竞态条件,导致数据的不一致性。
四、Qt数据库中原子操作的应用在Qt中,原子操作可以应用于各种情况,例如,在更新计数器、执行敏感操作等场景中。
使用Qt的原子操作类,可以确保在多线程环境下的数据一致性和完整性,避免了竞态条件的出现。
五、结论Qt的原子操作方法为数据库管理提供了强大的支持。
通过使用Qt的原子操作类,可以确保数据的安全性和完整性,避免了竞态条件的出现。
目录(篇2)1.引言2.Qt数据库原子操作方法3.原子操作的优势和实现方式4.原子操作的限制和注意事项5.结论正文(篇2)Qt数据库原子操作方法是一种确保数据库操作一致性的重要技术。
原子操作是指一个操作要么完全执行,要么不执行,没有中间状态。
这种技术可以确保在数据库中的数据不会因为操作过程中的错误而丢失。
原子操作的优点在于它可以确保数据库的一致性。
在传统的数据库操作中,如果发生错误,可能需要进行回滚操作,即撤销之前的所有操作。
原子操作避免了这种情况,因为它会确保在执行过程中出现的错误会导致整个操作被回滚,从而避免了数据的不一致性。
QT 知识点总结
1、QGridLayoutQGridLayout包含多个grid,它并没有要求其中的每个grid的size相同,通常情况下,每个grid的size是不同的。
对于成员函数addWidget(widget, fromRow, fromColumn, rowSpan, columnSpan, alignment):rowSpan表示新添加进来的widget在垂直方向上跨越或者占据多少个grid。
columnSpan表示新添加进来的widget在水平方向上跨越或者占据多少个grid。
2、line edit的input mask对一个line edit设置了input mask属性后,也就限定了输入字符。
一般情况下,需要填写的字符位置是空白的,但是,你可以让该空白以某个字符占位,你只需在指定input mask 的字符末尾添加―*?‖即可,把‗?‘换为你想用来占位的一个字符。
3、利用designer设计ui总体上来说,先创建各个控件,然后设置layout相对来说好些。
另外,grid layout对设置布局前的窗口布局依赖比较大,即如果设置grid layout前的布局不同,则生效后的差别可能较大。
4、QLabel的buddy属性在qt中,只有QLabel实现了buddy机制。
只有你为QLabel设置了buddy后,文本中的字符‗&‘才能以下划线显示(这点与其他widget 不同),并创建了对应的快捷键(当然,需要+Alt),然后可以利用快捷键迅速的把光标定位到该QLabel的buddy中,例如:QLabel *what = new QLabel(―Find &What:‖);该实例对应快捷键Alt+w。
5、QMouseEvent中的坐标QMouseEvent中保存了两个坐标,一个是全局坐标,当然另外一个是局部坐标。
全局坐标(globalPos())即是桌面屏幕坐标(screen coordinates),这个跟windows下的调用getCursorPos函数得到的结果一致。
心得体会qt(优秀18篇)
心得体会qt(优秀18篇)本文将从界面设计、可扩展性、易用性、性能和团队合作五个方面探讨Qt的设计心得。
首先,Qt作为一个图形界面框架,界面设计是重要的一环。
在设计界面时,要尽量简明扼要,不要添加过多的视觉元素,以免造成用户的混淆和不适。
突出重点功能,将核心操作置于界面的显著位置。
此外,也要注意UI的可定制性,让用户可以根据自己的需求个性化修改界面。
最重要的是,保持整体布局的一致性,遵循统一的视觉风格,使用户能够快速熟悉和使用。
其次,Qt的可扩展性是其杰出之处。
Qt支持模块化的设计,可以根据需求来选择和集成各种功能模块。
通过使用插件机制,我们可以轻松地添加、升级和删除功能,而不需要对整个应用程序进行重构。
这有助于提高代码的重用性和维护性,并为应用程序的发展和扩展提供了很大的灵活性。
另外,易用性也是一个重要的考虑因素。
Qt提供了丰富的自定义控件和工具,使我们能够快速构建用户友好的界面。
通过合理的布局和操作方式,用户可以直观地理解和使用应用程序。
同时,我们还可以利用Qt的事件和信号槽机制来实现交互动作和响应,使用户操作更加便捷和流畅。
总之,良好的易用性可以帮助我们吸引和留住用户。
与此同时,性能也是设计中需要重点关注的一个方面。
在使用Qt进行设计时,要尽量减少资源的占用和系统的开销。
例如,可以合理使用内存和处理器资源,优化算法和数据结构,减少重复计算和无效操作。
此外,我们还可以使用Qt提供的性能调优工具,如Qt分析器和性能监视器,来识别和解决性能瓶颈。
通过不断优化和改进,我们可以提高应用程序的响应速度和效率。
最后,团队合作是一个成功的设计过程中必不可少的因素之一。
Qt具有良好的跨平台性和协作工具,使团队成员可以在不同的操作系统和环境中共享和协同开发。
我们可以使用版本控制系统,如Git和SVN,来管理代码,确保项目的整体一致性和稳定性。
同时,我们还可以使用QtCreator等集成开发环境来促进团队成员之间的交流和合作。
qt总结感想
qt总结感想Qt是一种跨平台的C++应用程序开发框架,它提供了一套丰富的库和工具,可以帮助开发者轻松地构建各种类型的应用程序,包括图形用户界面(GUI)应用程序、命令行工具、嵌入式设备应用程序等等。
Qt的特点是简单易用、高效可靠、功能丰富,并且具有良好的可移植性。
Qt的简单易用让我印象深刻。
作为一个C++开发者,我发现Qt提供的API非常直观和易于理解。
Qt的类和函数命名规范清晰,符合直觉,使得编写代码变得简单快捷。
此外,Qt提供了丰富的文档和示例代码,帮助开发者快速上手并解决问题。
无论是初学者还是有经验的开发者,都可以轻松地使用Qt来开发应用程序。
Qt的高效可靠也是我对它的一大赞赏。
Qt的底层实现经过了精心设计和优化,使得应用程序在运行时具有出色的性能和稳定性。
Qt 使用了一种称为信号和槽(Signal and Slot)的机制来实现对象之间的通信,这种机制具有低耦合和高内聚的特点,使得代码易于维护和扩展。
此外,Qt还提供了一套完善的单元测试框架,可以帮助开发者编写高质量的测试用例,确保程序的正确性和稳定性。
Qt的功能丰富也是我对它的印象之一。
Qt提供了大量的模块和类,涵盖了图形、网络、数据库、多媒体、并发等各个领域的功能。
无论是开发桌面应用程序还是移动应用程序,Qt都能提供强大的支持。
例如,Qt的图形模块提供了丰富的绘图和渲染功能,可以轻松地创建各种精美的用户界面;Qt的网络模块提供了简单易用的API,可以方便地进行网络通信和数据交换;Qt的数据库模块提供了对多种数据库的访问支持,开发者可以方便地进行数据存储和查询操作。
Qt的可移植性让我对它赞不绝口。
Qt的设计目标之一就是实现跨平台开发,它可以在多个操作系统上运行,包括Windows、Linux、macOS等。
Qt使用了一种称为Qt编译器(qmake)的工具来管理项目和构建过程,开发者只需要编写一套代码,就可以将应用程序轻松地移植到不同的平台上,极大地提高了开发效率。
二十四、Qt数据库(四)利用QSqlQuery类执行SQL语句(二)
二,在SQL语句中使用变量。
我们先看下面的一个例子,将“查询”按钮的槽函数更改如下:void Widget::on_pushButton_clicked(){QSqlQuery query;query.prepare(“insert into student (id, name) ”“values (:id, :name)”);query.bindValue(0, 5);query.bindValue(1, “sixth”);query.exec();//下面输出最后一条记录query.exec(“select * from student”);st();int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << id << name;}运行效果如下:可以看到,在student表的最后又添加了一条记录。
在上面的程序中,我们先使用了prepare()函数,在其中利用了“:id”和“:name”来代替具体的数据,而后又利用bindValue()函数给id和name两个属性赋值,这称为绑定操作。
其中编号0和1分别代表“:id”和“:name”,就是说按照prepare()函数中出现的属性从左到右编号,最左边是0 。
这里的“:id”和“:name”,叫做占位符,这是ODBC数据库的表示方法,还有一种Oracle的表示方法就是全部用“?”号。
如下:query.prepare(“insert into student (id, name) ”“values (?, ?)”);query.bindValue(0, 5);query.bindValue(1, “sixth”);query.exec();我们也可以利用addBindValue()函数,这样就可以省去编号,它是按顺序给属性赋值的,如下:query.prepare(“insert into student (id, name) ”“values (?, ?)”);query.addBindValue(5);query.addBindValue(“sixth”);query.exec();当用ODBC的表示方法时,我们也可以将编号用实际的占位符代替,如下:query.prepare(“insert into student (id, name) ”“values (:id, :name)”);query.bindValue(“:id”, 5);query.bindValue(“:name”, “sixth”);query.exec();以上各种形式的表示方式效果是一样的。
QT知识点总结
QT知识点总结QT是一种跨平台的C++应用程序开发框架,被广泛用于开发图形界面应用程序。
在QT中,有一些重要的知识点需要掌握,以下是对这些知识点的总结。
1. 信号与槽机制(Signal and Slot Mechanism):QT 的一个重要特性是基于信号与槽机制进行事件处理。
信号是类似于函数的成员,用于通知发生了一些事件,槽是接收信号的函数,用于处理事件。
通过信号与槽机制,可以实现模块之间的通信和事件的处理。
2. 事件循环(Event Loop):QT 应用程序通过事件循环来处理用户输入事件和系统事件。
在事件循环中,应用程序等待输入事件的到来,并分发给对应的窗口进行处理。
事件循环使得 QT 应用程序能够实现快速响应用户操作的功能。
3. 组件与容器(Widgets and Containers):QT 提供了许多组件和容器,用于构建图形界面。
组件是用户可视化的元素,如按钮、文本框等,容器用于组织和布局组件。
QT 中的容器包括窗口、对话框、布局等。
通过组合使用组件和容器,可以构建出各种复杂的用户界面。
4. 布局管理(Layout Management):QT 提供了多种布局管理器,用于自动调整和组织界面上的组件。
布局管理器可以根据界面的大小和组件的特性,自动调整组件的大小和位置,以适应不同大小的屏幕和窗口。
使用布局管理器可以使得界面的编写更加灵活和易于维护。
5. 图形绘制(Graphics Drawing):QT 提供了丰富的图形绘制功能,可以用于绘制各种图形、图表和动画效果。
QT 的图形绘制功能是基于QPainter 类实现的,可以绘制直线、矩形、椭圆等基本图形,还可以绘制文本、图像和复杂的路径。
6. 信号与槽连接(Signal and Slot Connection):QT 通过信号与槽连接来实现对象之间的通信。
可以通过connect(函数将一个对象的信号与另一个对象的槽连接起来,当信号发出时,与之连接的槽函数将被调用。
Qt数据库(支持10种数据库)
Qt数据库(⽀持10种数据库) Qt 提供了 QtSql 模块来提供平台独⽴的基于 SQL 的数据库操作。
这⾥我们所说的“平台独⽴”,既包括操作系统平台,有包括各个数据库平台。
另外,我们强调了“基于 SQL”,因为 NoSQL 数据库⾄今没有⼀个通⽤查询⽅法,所以不可能提供⼀种通⽤的 NoSQL 数据库的操作。
Qt 的数据库操作还可以很⽅便的与 model/view 架构进⾏整合。
通常来说,我们对数据库的操作更多地在于对数据库表的操作,⽽这正是 model/view 架构的长项。
Qt 使⽤QSqlDatabase表⽰⼀个数据库连接。
更底层上,Qt 使⽤驱动(drivers)来与不同的数据库 API 进⾏交互。
Qt 桌⾯版本提供了如下⼏种驱动:驱动数据库QDB2IBM DB2 (7.1 或更新版本)QIBASE Borland InterBaseQMYSQL MySQLQOCI Oracle Call Interface DriverQODBC Open Database Connectivity (ODBC) – Microsoft SQL Server 及其它兼容 ODBC 的数据库QPSQL PostgreSQL (7.3 或更新版本)QSQLITE2SQLite 2QSQLITE SQLite 3QSYMSQL针对 Symbian 平台的SQLite 3QTDS Sybase Adaptive Server (⾃ Qt 4.7 起废除) 不过,由于受到协议的限制,Qt 开源版本并没有提供上⾯所有驱动的⼆进制版本,⽽仅仅以源代码的形式提供。
通常,Qt 只默认搭载 QSqlite 驱动(这个驱动实际还包括 Sqlite 数据库,也就是说,如果需要使⽤ Sqlite 的话,只需要该驱动即可)。
我们可以选择把这些驱动作为 Qt 的⼀部分进⾏编译,也可以当作插件编译。
如果习惯于使⽤ SQL 语句,我们可以选择QSqlQuery类;如果只需要使⽤⾼层次的数据库接⼝(不关⼼ SQL 语法),我们可以选择QSqlTableModel和QSqlRelationalTableModel。
多年来开发QT累计的笔记
QT学习笔记-1.QT主要的对象说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面所以现在想认认真真的学习一个c++图形界面框架库本来想学习Xwidget但是这个资料不大好找有啥问题不好解决那就学习QT吧不说QT的优缺点,不说如何编译QT从QT的主要库类开始吧知道了基本的对象之后如果需要学习看看文档就知道了如果需要编译QT的话再下个代码试着编译吧QApplication 应用程序类管理图形用户界面应用程序的控制流和主要设置QLabel 标签类提供文本或者图像的显示QPushButton 按钮类提供了命令按钮按钮的一种QButtonGroup 按钮组合类按钮组相关按钮的组合QGroupBox 群组类一个有标题的组合框QDateTimeEdit 日期时间编辑框类QLineEdit 行编辑框类单行文本编辑器QTextEdit 文本编辑框类单页面多信息编辑器对象QComboBox 组合框类QProgressBar 进度条类QLCDNumber 数字显示框类QScrollBar 滚动条类QSpinBox 微调框类QSlider 滑动条类QIconView 图标视图类QListView 列表视图类QListBox 列表框类QTable 表格类QValidator 有效性检查类QImage 图像类QMainWindow 主窗口类QPopupMenu 弹出性菜单类QMenuBar 菜单栏类QToolButton 工具按钮类QToolTip 提示类QWhatsThis 这是什么类QAction 动作类QHBoxLayout 水平布局类QVBoxLayout 垂直布局类QGridLayout 表格布局类QT对话框类QMessageBox 消息对话框类QProgressDialog 进度条对话框类QWizard 向导对话框类QFileDialog 文件对话框类QColorDialog 颜色对话框类QFontDialog 字体对话框类QPrintDialog 打印对话框类基本就这些对象了要系统学习QT 还需要看看QT的slot系统,QT库类接口等具体的学习就是看例子咯QT学习笔记-2.QT窗体布局和皮肤加载学习QT的一个原因是貌似QT做出来的界面比较绚丽我倒想看看能做出来啥样子的从QT窗体布局说起凡是窗体布局无非就是如何摆放的问题1.想当然如果摆放有2个方式一个是所见即所得,一个是使用布局管理器先说后者吧2.QT有好几种布局管理器无非就是啥子流式布局,格子布局等等从这个层级上说软件界面都是布局嵌套的3.布局和控件的关系一般是一个布局对应于一个控件容器(或者顶层控件)使用当前布局管理器加挂子控件(容器)即可然后给当前控件挂上布局管理器即可下面是一个简单的QT Layout的例子(从QT例子改的)1.class Dialog : public QDialog2.{3. Q_OBJECT4.public:5. Dialog();6.private:7. void createHorizontalGroupBox();8.9. enum {button_number = 4};10. QGroupBox *groupbox;11. QPushButton *buttons[button_number];12. QDialogButtonBox *buttonBox;13.};复制代码实现如下:1.#include <QtGui>2.3.#include "dialog.h"4.5.//! [0]6.Dialog::Dialog()7.{8. createHorizontalGroupBox();9.10. buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok11. | QDialogButtonBox::Cancel);12.13. connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));14. connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));15.16. QVBoxLayout *mainLayout = new QVBoxLayout;17. mainLayout->addWidget(groupbox);18. mainLayout->addWidget(buttonBox);19. setLayout(mainLayout);20.21. setWindowTitle(tr("LayoutTest"));22.}23.24.void Dialog::createHorizontalGroupBox()25.{26. groupbox = new QGroupBox(tr("Layout Test"));27. QHBoxLayout *layout = new QHBoxLayout;28.29. buttons[0] = new QPushButton(tr("Button1"));30. buttons[1] = new QPushButton(tr("Button2"));31. buttons[2] = new QPushButton(tr("Button3"));32. buttons[3] = new QPushButton(tr("Button4"));33.34. for(int i = 0;i<button_number;i++)35. layout->addWidget(buttons[i]);36. groupbox->setLayout(layout);37.}复制代码几个知识点:1.groupbox = new QGroupBox(tr("Layout Test"));Layout Test 是个文本这个无须解释那tr呢?查查资料知道是为了支持多语言先知道即可以后使用的话在具体查查吧2.QDialogButtonBox是个什么东西看看最终的程序界面吧原来是对话框的确认和取消按钮再看信号槽函数无非就是绑定按钮到操作函数connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));那accepted和accept函数有啥区别?看看文档accept函数的解释是:Hides the modal dialog and sets the result code to Accepted accpeted函数的解释是:This signal is emitted when the dialog has been accepted either在说说QT皮肤学习QT的主要目的就是想做做脸蛋好看好的软件界面那就试试看吧查到的QT有一个名叫QSS(CSS?)的文件可以原来换肤那就改改看吧#include <QApplication>#include <QFile>#include <QStyleFactory>#include <QTextStream>#include "dialog.h"void setSkin(QApplication* const app, QString const &skinFile);int main(int argc, char *argv[]){QApplication app(argc, argv);setSkin(&app ,"skin.qss");Dialog dialog;dialog.show();return app.exec();}void setSkin(QApplication* const app, QString const &skinFile){QFile qss(skinFile);qss.open(QFile::ReadOnly);app->setStyleSheet(qss.readAll());qss.close();}相应的QSS文件如下:QPushButton{color:red;background:url(setting.png)}这里把PushButton的文本颜色设置为红色同时把它的背景设置为图片stting.pngQT学习笔记-3.Codecs例子学习QT自带的例子Codecs是一篇关于保存和载入不同编码文本的例子其界面比较简单一个简单的单文档而已有2个主要的对象一个是MainWindow用于窗体主界面另外一个是PreviewForm用于显示编码格式列表1.其编码格式的获取部分代码如下:QMap<QString, QTextCodec *> codecMap;QRegExp iso8859RegExp("ISO[- ]8859-([0-9]+).*");foreach (int mib, QTextCodec::availableMibs()) {QTextCodec *codec = QTextCodec::codecForMib(mib);QString sortKey = codec->name().toUpper();int rank;if (sortKey.startsWith("UTF-8")) {rank = 1;} else if (sortKey.startsWith("UTF-16")) {rank = 2;} else if (iso8859RegExp.exactMatch(sortKey)) {if (iso8859RegExp.cap(1).size() == 1)rank = 3;elserank = 4;} else {rank = 5;}sortKey.prepend(QChar('0' + rank));codecMap.insert(sortKey, codec);}codecs = codecMap.values();通过使用foreach循环来获取支持的编码格式并保存不过看上去foreach (int mib, QTextCodec::availableMibs())有点奇怪查查资料解释是foreach(variables ,container)关键字是Qt对c++的一个扩展,主要用于按顺序历经容器(container)中的对象2关于文件菜单的生成和设置菜单的构造一个例子saveAsMenu = new QMenu(tr("&Save As"), this);这里有2个参数一个是菜单显示文另外一个是当前窗体指针然后就可以加载子菜单,设置分隔符,设置事件响应等操作了例子为:fileMenu = new QMenu(tr("&File"), this);fileMenu->addAction(openAct);fileMenu->addMenu(saveAsMenu);fileMenu->addSeparator();fileMenu->addAction(exitAct);那如何绑定菜单到当前窗体呢如下:menuBar()->addMenu(fileMenu);menuBar()->addSeparator();menuBar()->addMenu(helpMenu);menuBar()是QmainWindow的成员函数用于获取窗体菜单项指针3.QT对象QActionQT文档对QAction的解释是可以抽象用户接口对象-可以插入控件例子如下:openAct = new QAction(tr("&Open"), this);openAct->setShortcuts(QKeySequence::Open);connect(openAct, SIGNAL(triggered()), this, SLOT(open()));无非就是对象声明,设置快捷键,链接函数和响应而已4.窗体设置setWindowTitle(tr("Codecs"));resize(500, 400);5.消息对话框QMessageBox::about(this, tr("About Codecs"),tr("The <b>Codecs</b> example demonstrates how to read and write " "files using various encodings."));QT学习笔记-4.信号与插槽本文主要是对C++ GUI Programming with Qt4一书 Signals and Slots in Depth 部分的翻译信号与插槽机制是Qt编程的基础.它可以绑定对象而不需要对象之间彼此了解。
Qt5笔记之数据库(五)SQL表格模型QSqlTableModel
Qt5笔记之数据库(五)SQL表格模型QSqlTableModel 0.打开tablemodel.pro⽂件,加上:QT += coregui sql注意⼀定得是加上!若把原来那句改了,会报错1.添加头⽂件connection.h2.main.cpp⽂件中include connection.h,调⽤CreateConnection()⽅法3.完成后到mainwindow.h⽂件中,先包含头⽂件:include然后添加私有对象:QSqlTableModel *model;4.在tableEdit中显⽰数据库tablemodel,常放在mainwindow的构造函数中:model = new QSqlTableModel(this);model->setTable("student"); //选表model->setEditStrategy(QSqlTableModel::OnManualSubmit); //选编辑策略model->select(); //选取整个表的所有⾏相当于select all//不显⽰name属性列,如果这时添加记录,则该属性的值添加不上//model->removeColumn(1);ui->tableView->setModel(model); //显⽰在tableView中//使其不可编辑//ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);5.在mainwindow.cpp中加上如下内容,⽅便后⾯的增删改查include "QMessageBox"include "QSqlError"6.提交:model->database().transaction(); //开始事务操作if (model->submitAll()) {model->database().commit(); //提交} else {model->database().rollback(); //回滚QMessageBox::warning(this, tr("tableModel"),tr("数据库错误: %1").arg(model->lastError().text()));}6.撤销(若未提交则可撤销所有更改)model->revertAll();7.添加:改善了原教程中的主键默认值int rowNum = model->rowCount(); //获得表的⾏数//⼈⼯递增主键idQSqlQuery query;query.exec("select max(id) from student"); query.first() ;int id = query.value(0).toInt() + 1;//添加model->insertRow(rowNum); //添加⼀⾏model->setData(model->index(rowNum,0),id); //model->submitAll(); //可以直接提交。
QT数据库QSqlQuery
QT数据库QSqlQuerySQL执⾏操作QSqlQuery提供了对数据库记录的Select、Insert、Update、Delete操作。
SELECT操作:QSqlQuery query;query.exec("SELECT name, salary FROM employee WHERE salary > 50000");while (query.next()) {QString name = query.value(0).toString();int salary = query.value(1).toInt();qDebug() << name << salary;}通过QSqlQuery::next()、QSqlQuery::previous()、QSqlQuery::first()、QSqlQuery::last()、QSqlQuery::seek(),可以得到下⼀条、上⼀条、第⼀条、最后⼀条、任意⼀条记录的位置。
INSERT操作://单⼀插⼊数据QSqlQuery query;query.prepare("INSERT INTO employee (id, name, salary) ""VALUES (:id, :name, :salary)");query.bindValue(":id", 1001);query.bindValue(":name", "Thad Beaumont");query.bindValue(":salary", 65000);query.exec();//批量插⼊数据QSqlQuery query;query.prepare("insert into myTable values (?, ?)");QVariantList ints;ints << 1 << 2 << 3 << 4;query.addBindValue(ints);QVariantList names;names << "Harald" << "Boris" << "Trond" <<QVariant(QVariant::String);query.addBindValue(names);if (!query.execBatch())qDebug() << stError();UPDATE操作:QSqlQuery query;query.prepare("UPDATE employee SET salary = ? WHERE id = 1003");query.bindValue(0, 70000);query.exe();DELETE操作:QSqlQuery query;query.exec("DELETE FROM employee WHERE id = 1007");事务处理:QSqlDatabase::database().transaction();QSqlQuery query;query.exec("SELECT id FROM employee WHERE name = 'Torild Halvorsen'");if (query.next()) {int employeeId = query.value(0).toInt();query.exec("INSERT INTO project (id, name, ownerid) ""VALUES (201, 'Manhattan Project', "+ QString::number(employeeId) + ")");}QSqlDatabase::database().commit();如果数据库引擎⽀持事务处理,则函数QSqlDriver::hasFeature(QSqlDriver::Transactions)将返回真。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#includeQT += sqlQSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类封装数据库所有记录第一:QSqlDatabase类QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 采用QSQLITE 数据库,QMYSQL数据库有问题?db.setHostName("localhost"); //设置数据库主机名db.setDatabaseName("test"); //设置数据库名db.setUserName("root"); //设置数据库登入用户名db.setPassword("123456"); //设计数据库登入密码db.open()打开数据库连接db.close();//释放数据库QStringList drivers = QSqlDatabase::drivers();//静态成员函数,是类的成员函数,不是对象的.返回所有可用的数据库驱动程序的清单 drivers.removeAll("QMYSQL3"); //删除列表中的项foreach(QString driver, drivers) //遍历数据库驱动,测试数据库驱动种类qDebug() << “\t” << driver;建立数据库文件QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("database.db");if(!db.open()) return false;QSqlQuery query;query.exec("create table Login(id INTEGER PRIMARY KEY autoincrement, " //id会自动增加,因为这里不能重复,否则数据库无法修改"goods int, store int, time nvarchar(50), type int, place nvarchar(50),temperaturenvarchar(10) )");//query.exec("insert into Login values(1,1002,1,'2011-9-6',1,'common',24)");// query.exec("insert into Login values(2,1005,1,'2011-9-6',1,'common',24)");//query.exec("insert into Login values(3,1010,2,'2011-9-7',2,'common',25)");// query.exec("insert into Login values(4,1012,2,'2011-9-7',2,'common',25)");query.exec("insert into Login values( 1,NULL , NULL,NULL, NULL,NULL,NULL )");query.exec("insert into Login values( 2,NULL , NULL,NULL, NULL,NULL,NULL )");query.exec("insert into Login values( 3,NULL , NULL,NULL, NULL,NULL,NULL )");query.exec("insert into Login values( 4,NULL , NULL,NULL, NULL,NULL,NULL )");query.exec("insert into Login values( 5,NULL , NULL,NULL, NULL,NULL,NULL )");query.exec("insert into Login values( 6,NULL , NULL,NULL, NULL,NULL,NULL )");第二:QSqlQuery类,查询数据库,插入值到数据库等操作数据库QSqlQuery query;query.prepare("INSERT INTO T_USER (name, age) VALUES (:name, :age)"); //准备执行SQL查询query.bindValue(":name", "justin"); //在这定占位符上确定绑定的值query.bindValue(":age", 33);query.exec();QSqlQuery query; //以下执行相关QSL语句query.exec(“create table student(id int primary key,name varchar)”);//新建student表,id设置为主键,还有一个name项query.exec(“insert into student values(1,’xiaogang’)”);query.exec(“insert into student values(2,’xiaoming’)”);query.exec(“insert into student values(3,’xiaohong’)”);//向表中插入3条记录query.exec(“select * from student”);来查询出表中所有的内容。
其中的SQL语句“select * from student”中“*”号表明查询表中记录的所有属性。
而当query.exec(“select * from student”); 这条语句执行完后,我们便获得了相应的执行结果,因为获得的结果可能不止一条记录,所以我们称之为结果集。
while(query.next())QString name = query.value(0).toString(); //返回"name"字段的索引值"justin",value(i)返回i字段的值,0表示name,1表示ageint id = query.value(1).toInt();seek(int n) :query指向结果集的第n条记录。
指定当前的位置first() :query指向结果集的第一条记录。
last() :query指向结果集的最后一条记录。
next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。
previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。
record() :获得现在指向的记录。
value(int n) :获得属性的值。
其中n表示你查询的第n个属性,比方上面我们使用“select * from student”就相当于“select id, name from student”,那么value(0)返回id属性的值,value(1)返回name属性的值。
该函数返回QVariant类型的数据,关于该类型与其他类型的对应关系,可以在帮助中查看QVariant。
at()//返回当前查询的位置int fieldNo = query.record().indexOf(“name”);//返回"name"的列号int rowNum = query.at();//获取query所指向的记录在结果集中的编号int columnNum = query.record().count();//获取每条记录中属性(即列)的个数int fieldNo = query.record().indexOf(“name”);//获取”name”属性所在列的编号,列从左向右编号,最左边的编号为0int id = query.value(0).toInt();//获取id属性的值,并转换为int型QString name = query.value(fieldNo).toString();//获取name属性的值qDebug() << “rowNum is : ” << rowNum //将结果输出<< ” id is : ” << id<< ” name is : ” << name<< ” columnNum is : ” << columnNum;}if(query.seek(2)) //seek指定当前的位置if(query.seek(ui->spinBox->value())){qDebug() << query.value(0).toInt() <<query.value(1).toString();while(query.next()) //每执行一次该函数,便指向相邻的下一条记录。
{qDebug() << query.value(0).toInt() << query.value(1).toString(); //value(i)返回i字段的值,0表示id,1表示name}}//批处理操作函数--批量插入到数据库中QSqlQuery q;q.prepare(“insert into student values (?, ?)”);QVariantList ints; //QVariantList==QListints << 10 << 11 << 12 << 13;q.addBindValue(ints); //绑定QVariantList names;names << “xiaoming” << “xiaoliang” << “xiaogang” << QVariant(QVariant::String);//最后一个是空字符串,应与前面的格式相同q.addBindValue(names);if (!q.execBatch()) //进行批处理,如果出错就输出错误qDebug() << stError();//事务操作--操作函数transaction(),commit()提交,rollback()回滚事务是数据库的一个重要功能,所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。