一、驱动
(一)windows系统
需要手动编译qsqlmysql.dll和qsqlmysql.debug文件,详细参考:【BUG解决】qt6.9.3 连接MySQL8.0.44 失败(缺少驱动文件)
(二)linux系统
需要从镜像源下载libqsqlmysql.so文件
qt6驱动下载指令
sudo apt update
sudo apt install libqt6sql6-mysql # Qt6的MySQL驱动包
qt5驱动下载
sudo apt update
sudo apt install libqt5sql5-mysql # Qt5的MySQL驱动包
检查驱动文件
qt6驱动路径
ls /usr/lib/x86_64-linux-gnu/qt6/plugins/sqldrivers/libqsqlmysql.so
qt5驱动路径
ls /usr/lib/x86_64-linux-gnu/qt5/plugins/sqldrivers/libqsqlmysql.so
设置插件路径环境变量
qt6:
export QT_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt6/plugins
qt5:
export QT_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt5/plugins
qDebug() << "可用驱动列表:" << QSqlDatabase::drivers();
// 若输出包含"QMYSQL",则驱动加载成功
二、连接数据库
(一) QSqlDatabase
QSqlDatabase 是 Qt 中管理数据库连接的核心类,负责建立、配置、打开数据库连接,并为 QSqlQuery、QSqlQueryModel 等类提供数据库访问入口
cpp
db = QSqlDatabase::addDatabase("QMYSQL");//注册 MySQL 驱动
//配置数据库参数(替换为你的实际信息)
db.setHostName("127.0.0.1"); // 本地数据库
db.setPort(3306); // MySQL 默认端口
db.setDatabaseName("test"); // 数据库名(你的库)
db.setUserName("root"); // 用户名
db.setPassword("123456"); // 密码
db.setConnectOptions("CHARSET=utf8mb4"); // 避免中文乱码
//打开连接并验证
if (db.open()) {
qDebug()<< "运行日志: 数据库连接成功 ";
QMessageBox::information(this, "成功", "MySQL 连接成功!");
return true;
} else {
QString error = "连接失败:" + db.lastError().text();
qDebug()<< "运行日志: 数据库连接失败 " << error;
return false;
}
三、执行sql,操作数据库
(一) QSqlQuery
执行 SQL语句
cpp
QSqlQuery query(db); // 或 QSqlQuery query(connName);
if (query.exec("SELECT id, name FROM users")) {
while (query.next()) {
qDebug() << "ID:" << query.value(0).toInt()
<< "Name:" << query.value(1).toString();
}
} else {
qDebug() << "查询失败:" << query.lastError().text();
}
(二)QSqlQueryModel
QSqlQueryModel 是 Qt SQL 模块中基于 SQL 查询结果的只读模型类,主要用于与 Qt 视图(如 QTableView)结合,以 "模型 - 视图" 架构展示数据库查询结果。它本身是只读的,需配合 QSqlQuery 完成增删改操作,再刷新模型以同步数据
cpp
#include <QSqlQueryModel>
#include <QSqlDatabase>
#include <QTableView>
#include <QApplication>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
// 1. 初始化数据库连接(需先确保连接成功)
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setDatabaseName("test_db");
db.setUserName("root");
db.setPassword("123456");
if (!db.open()) {
qDebug() << "连接失败:" << db.lastError().text();
return -1;
}
// 2. 创建 QSqlQueryModel 并执行查询
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT id, name, age FROM users", db); // 绑定数据库连接
// 3. 检查查询错误
if (model->lastError().isValid()) {
qDebug() << "查询错误:" << model->lastError().text();
delete model;
return -1;
}
// 4. 设置表头(可选,增强可读性)
model->setHeaderData(0, Qt::Horizontal, "用户ID");
model->setHeaderData(1, Qt::Horizontal, "姓名");
model->setHeaderData(2, Qt::Horizontal, "年龄");
// 5. 绑定到视图展示
QTableView view;
view.setModel(model);
view.resize(400, 300);
view.show();
return a.exec();
}
(三)QSqlTableModel
QSqlTableModel 是 Qt 提供的单表数据库模型类(属于 MVC 架构中的 "模型"),专门用于简化单张数据库表的增删改查操作,通常与视图(如 QTableView)配合实现数据可视化,也可单独用于数据操作
创建实例
cpp
#include <QSqlTableModel>
#include <QSqlDatabase>
#include <QTableView>
#include <QApplication>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
// 1. 确保数据库已连接(示例用默认连接)
QSqlDatabase db = QSqlDatabase::database();
if (!db.isOpen()) {
qCritical() << "数据库未连接";
return -1;
}
// 2. 创建 QSqlTableModel(指定数据库连接,默认用 db)
QSqlTableModel *model = new QSqlTableModel(nullptr, db);
// 3. 设置要操作的表名
model->setTable("user"); // 操作名为 user 的表
// 4. 设置编辑策略(推荐手动提交)
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
// 5. 加载表数据(必须调用 select() 才会从数据库读取数据)
if (!model->select()) {
qCritical() << "加载数据失败:" << model->lastError().text();
return -1;
}
// 后续操作...
return a.exec();
}
绑定视图
cpp
// 创建视图
QTableView *view = new QTableView;
// 将模型绑定到视图
view->setModel(model);
// 显示视图(自动展示 user 表的所有数据)
view->show();
QSqlQueryModel与QSqlTableModel 的区别
| 特性 | QSqlQueryModel | QSqlTableModel |
|---|---|---|
| 编辑性 | 默认只读 | 支持直接编辑(可通过 setEditStrategy 配置) |
| SQL 灵活性 | 支持任意复杂 SQL 查询(多表、聚合) | 仅支持单表操作,SQL 由模型自动生成 |
| 使用场景 | 复杂查询结果展示 | 单表的增删改查(快速开发) |
所以更推荐使用QSqlQueryModel做数据库的增删改查,在拼接sql语句时防止sql注入,使用prepare()和bindValue()搭配