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

相关推荐
施嘉伟18 小时前
Oracle 10046 Trace 硬核指南:SQL 慢在哪,从底层拉出来
数据库·sql·oracle
Henry Zhu12318 小时前
Qt样式系统详解(上)
qt
程序猿零零漆19 小时前
Spring之旅 - 记录学习 Spring 框架的过程和经验(十二)Spring整合web环境
学习·spring
_ziva_19 小时前
MAC-SQL 多智能体协作框架解析
数据库·oracle
最贪吃的虎19 小时前
Redis其实并不是线程安全的
java·开发语言·数据库·redis·后端·缓存·lua
深蓝海拓19 小时前
PySide6从0开始学习的笔记(二十三)使用QRunnable在线程池中执行临时任务
笔记·python·qt·学习·pyqt
CCPC不拿奖不改名19 小时前
网络与API:HTTP基础+面试习题
网络·python·网络协议·学习·http·面试·职场和发展
声网19 小时前
如何用 Fun-ASR-Nano 微调一个「听懂行话」的语音模型?丨Voice Agent 学习笔记
笔记·学习·xcode
代码不停19 小时前
MySQL事务
android·数据库·mysql