【QT学习】qt项目使用MySQL数据库

一、驱动

(一)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()搭配

相关推荐
李广坤9 小时前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区1 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
西岸行者2 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
加号32 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏2 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐2 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再2 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest2 天前
数据库SQL学习
数据库·sql
jnrjian2 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle