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

相关推荐
蜡笔小炘14 分钟前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长17 分钟前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
R_.L33 分钟前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
奶茶精Gaaa41 分钟前
工具分享--json在线转换工具
学习
Re.不晚1 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
wdfk_prog1 小时前
[Linux]学习笔记系列 -- [drivers][I2C]I2C
linux·笔记·学习
老邓计算机毕设1 小时前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
盐焗西兰花1 小时前
鸿蒙学习实战之路-Reader Kit自定义字体最佳实践
学习·华为·harmonyos
麦聪聊数据1 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300961 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python