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

相关推荐
小嘉丶学长1 天前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节
心梦缘-雪雁1 天前
SQL Server 查询数据存在哪个表里
数据库
小李不想当小白1 天前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
chari克里1 天前
QT5.15.2 + msvc2022部署全流程说明(windows可联网环境)
开发语言·c++·qt
lusklusklusk1 天前
Python 巡检脚本:进程运行状态、数据库写入时效检查及邮件通知与告警
数据库·python·oracle
GeW1 天前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
透明的玻璃杯1 天前
VS2015+QT 多线程
开发语言·qt
SelectDB1 天前
Doris Arrow Flight SQL 高速读取协议实战:与 Snowflake 客户端取数链路对照
大数据·数据库·数据分析
曼岛_1 天前
[图解密码学]第4章 古典密码
java·数据库·密码学
瀚高PG实验室1 天前
HGDB V9.0.5 .pgpass 免密登录提示 IsEncryptNon-base64 encoding 警告处理
数据库·postgresql·瀚高数据库