00. 目录

文章目录

  • 00. 目录
  • 01. 概述
  • 02. 开发环境
  • 03. QSqlQueryModel查询模型
  • 04. QSqlQueryModel常用操作
  • 05. QSqlQueryModel自定义模型
  • 06. 附录

01. 概述

Qt中使用了自己的机制来避免使用SQL语句,为开发者提供了更简单的数据库操作及数据显示模型,分别是只读的QSqlQueryModel,操作单表的QSqlTableModel以及可以支持外键的QSqlRelationalTableModel。

02. 开发环境

Windows系统:Windows10

Qt版本:Qt5.15或者Qt6

03. QSqlQueryModel查询模型

3.1 新建Qt Widgets应用,项目名称为15SQL,基类为QMainWindow类名为MainWindow保持默认即可。

3.2 完成后打开15SQL.pro,添加SQL模块

QT       += core gui sql

3.3 项目中添加新的C++头文件,名称为connection.h,完成后将其内容更改如下:

#ifndef CONNECTION_H
#define CONNECTION_H#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>static bool createConnection()
{QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("test.db");if (!db.open()){return false;}QSqlQuery query;query.exec("create table student(id int primary key, name varchar(20))");query.exec("insert into student values(1, 'first')");query.exec("insert into student values(2, 'second')");query.exec("insert into student values(3, 'third')");query.exec("insert into student values(4, 'fourth')");query.exec("insert into student values(5, 'fifth')");return true;
}#endif // CONNECTION_H

这里使用了db.setDatabaseName(“test.db”),没有再使用以前的内存数据库,而是使用了真实的文件,这样后面对数据库进行的操作就能保存下来了。

3.4 main.cpp文件修改内容如下

#include "mainwindow.h"#include <QApplication>
#include "connection.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()){return 1;}MainWindow w;w.show();return a.exec();
}

3.5 进入设计模式,向界面上拖入一个Push Button按钮,更改显示文本为“查询”,然后进入其单击信号槽,更改如下:

void MainWindow::on_pushButton_clicked()
{QSqlQueryModel *model = new QSqlQueryModel(this);model->setQuery("select * from student");model->setHeaderData(0, Qt::Horizontal, tr("ID"));model->setHeaderData(1, Qt::Horizontal, tr("Name"));QTableView *view = new QTableView;view->setModel(model);view->show();}

这里新建了QSqlQueryModel类对象model,并用setQuery()函数执行了SQL语句“(“select * fromstudent”);”用来查询整个student表的内容,可以看到,该类并没有完全避免SQL语句。然后我们设置了表中字段显示时的名字。最后我们建立了一个视图view,并将这个model模型关联到视图中,这样数据库中的数据就能在窗口上的表中显示出来了。

执行结果如下:

04. QSqlQueryModel常用操作

4.1 在查询按钮槽函数中继续添加如下代码:

void MainWindow::on_pushButton_clicked()
{QSqlQueryModel *model = new QSqlQueryModel(this);model->setQuery("select * from student");model->setHeaderData(0, Qt::Horizontal, tr("ID"));model->setHeaderData(1, Qt::Horizontal, tr("Name"));QTableView *view = new QTableView;view->setModel(model);view->show();//列数int column = model->columnCount();//行数int row = model->rowCount();//获取记录QSqlRecord record = model->record(1);QModelIndex index = model->index(1, 1);qDebug() << "column num: " << column << Qt::endl<< "row num: " << row << Qt::endl<< "record: " << record << Qt::endl<< "index(1, 1): " << index.data();}

执行结果

column num:  2
row num:  5
record:  QSqlRecord(2)0: QSqlField("id", int, tableName: "student", generated: yes, typeID: 1, autoValue: false, readOnly: false) "2" 1: QSqlField("name", QString, tableName: "student", generated: yes, typeID: 3, autoValue: false, readOnly: false) "second"
index(1, 1):  QVariant(QString, "second")

4.2 直接使用QSqlQuery来执行SQL语句


void MainWindow::on_pushButton_clicked()
{QSqlQueryModel *model = new QSqlQueryModel(this);model->setQuery("select * from student");model->setHeaderData(0, Qt::Horizontal, tr("ID"));model->setHeaderData(1, Qt::Horizontal, tr("Name"));QTableView *view = new QTableView;view->setModel(model);view->show();QSqlQuery query = model->query();query.exec("select * from student where id = 2");query.next();qDebug() << query.value(0).toInt() << " " << query.value(1).toString() << Qt::endl;}

执行结果

2   "second"

4.3 使用QSqlQuery添加数据

void MainWindow::on_pushButton_clicked()
{QSqlQueryModel *model = new QSqlQueryModel(this);model->setQuery("select * from student");model->setHeaderData(0, Qt::Horizontal, tr("ID"));model->setHeaderData(1, Qt::Horizontal, tr("Name"));QTableView *view = new QTableView;view->setModel(model);view->show();QSqlQuery query = model->query();query.exec("insert into student values(10, 'deng10')");}

然后运行程序,发现最后添加的记录并没有显示出来,当关闭表格窗口,再次单击查询按钮的时候才显示出来。

我们执行了添加记录的SQL语句,但是在添加记录之前,查询结果就已经显示了,所以我们的更新没能动态的显示出来。为了能让其动态地显示我们的更新,可以将槽最后添加的代码更改如下:

void MainWindow::on_pushButton_clicked()
{QSqlQueryModel *model = new QSqlQueryModel(this);model->setQuery("select * from student");model->setHeaderData(0, Qt::Horizontal, tr("ID"));model->setHeaderData(1, Qt::Horizontal, tr("Name"));QTableView *view = new QTableView;view->setModel(model);view->show();QSqlQuery query = model->query();query.exec("insert into student values(10, 'deng10')");//再次执行查询model->setQuery("select * from student");view->show();}

05. QSqlQueryModel自定义模型

QSqlQueryModel模型默认是只读的,所以在窗口上并不能对表格中的内容进行修改。但是我们可以创建自己的模型,然后按照自己的意愿来显示数据和修改数据。要想使其可读写,需要自己的类继承自QSqlQueryModel,并且重写setData() 和 flags() 两个函数。如果我们要改变数据的显示,就要重写data() 函数。

我们将要实现student表查询结果的id字段显示红色,name字段可编辑。

5.1 向项目中添加新的C++类,类名为MySqlQueryModel,基类Base class保持Custom,然后在下面手动填写QSqlQueryModel。

5.2 mysqlquerymodel.h内容如下:

#ifndef MYSQLQUERYMODEL_H
#define MYSQLQUERYMODEL_H#include <QSqlQueryModel>class MySqlQueryModel : public QSqlQueryModel
{public:explicit MySqlQueryModel(QObject *parent = 0);// QAbstractItemModel interface
public:QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;bool setData(const QModelIndex &index, const QVariant &value, int role);Qt::ItemFlags flags(const QModelIndex &index) const;private:bool setName(int id, const QString &name);void refresh();
};#endif // MYSQLQUERYMODEL_H

5.3 mysqlquerymodel.cpp文件内容如下

#include "mysqlquerymodel.h"
#include <QSqlQuery>
#include <QColor>
#include <QModelIndex>MySqlQueryModel::MySqlQueryModel(QObject *parent):QSqlQueryModel(parent)
{}//添加数据
bool MySqlQueryModel::setData(const QModelIndex &index, const QVariant &value, int role)
{Q_UNUSED(role)if (index.column() < 1 || index.column() > 2){return false;}QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);//获取ID号int id = data(primaryKeyIndex).toInt();clear();bool ret = false;//设置第二个字段可以更改if (index.column() == 1){ret = setName(id, value.toString());}refresh();return ret;
}//返回表格是否可以被更改的标志
Qt::ItemFlags MySqlQueryModel::flags(const QModelIndex &index) const
{Qt::ItemFlags flags = QSqlQueryModel::flags(index);//第二个字段可以更改if (index.column() == 1){flags |= Qt::ItemIsEditable;}return flags;
}//更改数据显示样式
QVariant MySqlQueryModel::data(const QModelIndex &index, int role) const
{QVariant value = QSqlQueryModel::data(index, role);//第一个字段的字体颜色为红色if (role == Qt::TextColorRole && index.column() == 0){return QVariant::fromValue(QColor(Qt::red));}return value;
}//添加name字段的值
bool MySqlQueryModel::setName(int id, const QString &name)
{QSqlQuery query;query.prepare("update student set name = ? where id = ?");query.addBindValue(name);query.addBindValue(id);return query.exec();
}//更新显示
void MySqlQueryModel::refresh()
{setQuery("select * from student");setHeaderData(0, Qt::Horizontal, QObject::tr("id"));setHeaderData(1, Qt::Horizontal, QObject::tr("name"));
}

5.4 查询按钮槽函数更改如下:

void MainWindow::on_pushButton_clicked()
{QSqlQueryModel *model = new QSqlQueryModel(this);model->setQuery("select * from student");model->setHeaderData(0, Qt::Horizontal, tr("ID"));model->setHeaderData(1, Qt::Horizontal, tr("Name"));QTableView *view = new QTableView;view->setModel(model);view->show();//创建自己的模型MySqlQueryModel *model1 = new MySqlQueryModel(this);model1->setQuery("select * from student");model1->setHeaderData(0, Qt::Horizontal, tr("ID"));model1->setHeaderData(1, Qt::Horizontal, tr("Name"));QTableView *view1 = new QTableView;view1->setModel(model1);view1->show();}

执行结果如下:

06. 附录

6.1 Qt教程汇总
网址:https://dengjin.blog.csdn.net/article/details/115174639

6.2 源码下载
网址:【Qt】数据库实战之QSqlQueryModel.rar

【Qt】数据库实战之QSqlQueryModel相关推荐

  1. 【Qt】数据库实战之QSqlRelationalTableModel

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlRelationalTableModel外键 04. QSqlRelationalDelegate委托类 05. ...

  2. 【Qt】数据库实战之QSqlTableModel模型

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlTableModel基本操作 04. QSqlTableModel修改操作 05. QSqlTableModel查 ...

  3. 【Qt】数据库实战(三)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 增删改查操作 04. 名字绑定和位置绑定 05. 程序示例 06. 批处理操作 07. 事务操作 08. 附录 01. 概 ...

  4. 【Qt】数据库实战(二)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 连接到数据库 04. 操作结果集 06. 附录 01. 概述 SQL即结构化查询语言,是关系数据库的标准语言.前面已经在Q ...

  5. 【Qt】数据库实战(一)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 数据库驱动 04. 创建数据库连接 05. 数据库简单操作 06. 附录 01. 概述 Qt中的Qt SQL模块提供了对数 ...

  6. 深入浅出Qt数据库编程:从基本操作到高级技巧

    深入浅出Qt数据库编程:从基本操作到高级技巧 (Demystifying Qt Database Programming: From Basic Operations to Advanced Tech ...

  7. Qt数据库操作(三) -- 使用SQL模型类

    文章目录 Qt数据库操作(三) -- 使用SQL模型类 1.SQL查询模型 2.SQL表格模型 3.关系表格模型 Qt数据库操作(三) – 使用SQL模型类 Qt 提供了3个高级的类来访问数据库,分别 ...

  8. QT学习日记17——Qt数据库

    学习视频链接 2021新版QT图形框架编程开发(层层到肉)_C++图形用户界面开发框架_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Wf4y1Y7uh ...

  9. Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)

    文章目录 一.操作示例 1.1 修改记录(数据) 1.2 添加记录(数据) 1.3 删除记录(数据) 1.4 取消操作 1.5 排序操作 1.6 查询操作 二.了解QSqlTableModel 三.源 ...

最新文章

  1. SQL压力测试用的语句和相关计数器
  2. CDN网络究竟是怎么加速的?
  3. memcached ---- 学习笔记
  4. open live writer
  5. 支持64位系统的XOR加密后内存加载PE绕过杀毒软件
  6. dll可以在linux下使用吗_Linux下安装和使用杀毒软件AntiVir
  7. LeetCode--62.不同路径(排列组合,动态规划)
  8. ios 短信验证码自动填充时总是被复制两遍
  9. C语言标准库<string.h>
  10. 53.Azure中CentOS的Docker里安装运行SQL Server容器
  11. #55 #56 #58 #59 #60 #66
  12. pip 源使用阿里云镜像加速
  13. 用scanf输入long long 型的数
  14. Eclipse创建JSP程序
  15. 计算机专业硕士求职经历(转)
  16. 在线编辑Word——插入表格
  17. 用计算机信息术语感恩老师,感恩老师的祝福语(精选50句)
  18. Apache Kafka(七)- Kafka ElasticSearch Comsumer
  19. Java:String类学习笔记
  20. 奇数位升序偶数位降序链表排序

热门文章

  1. libevent(1)
  2. 一个Excel导出类的实现过程(二):显示定制
  3. 《微软应用架构指南》前言
  4. C#面向对象设计模式纵横谈——Singleton单件(创建型模式)
  5. linux双网卡私网,linux双网卡路由配置私网专线
  6. 人与计算机的未来_身边的很多人都在学习计算机,学习计算机到底能带来哪些好处...
  7. 快搜浏览器_opera、Google、firefox三个浏览器的选择
  8. linux字符设备移动硬盘,Red Hat Enterprise Linux 7.5挂载NTFS移动硬盘
  9. Java黑皮书课后题第4章:*4.3(几何:估算面积)应用4.1节图中以下地点的GPS位置:Georgia州的Atlanta……计算被这四个城市所围起来的区域面积
  10. 硬盘基本知识(磁头、磁道、扇区、柱面) 转