Qt读写SQLite示例

Qt 中读写数据库,常用的方式是通过 Qt SQL 模块(QtSql) ,它提供了一个统一的数据库访问接口,支持多种数据库驱动(SQLite、MySQL、PostgreSQL、ODBC 等)。

对于轻量级的嵌入式应用,SQLite 是最常用的数据库,因为它无需安装独立服务,只需要一个数据库文件即可完成数据存储和读写,非常适合 Qt 桌面应用。


✅ Qt 访问数据库的常用方式

方式 优点 缺点 适用场景
QSqlDatabase + QSqlQuery 直接操作 SQL 语句,灵活、通用 需要手动写 SQL,容易出错 对 SQL 熟悉,灵活需求
QSqlTableModel / QSqlRelationalTableModel 直接与 Qt Model/View 框架配合,支持表格视图显示 只适合简单表格,不便于复杂查询 需要与 QTableView 绑定的 UI
QSqlQueryModel 支持只读 SQL 查询结果显示 不能直接修改数据 需要展示查询结果但不修改数据

👉 推荐

  • 如果你只是简单地读写数据库,用 QSqlDatabase + QSqlQuery 方式最灵活。

  • 如果要直接绑定到 QTableView,可以用 QSqlTableModel


💡 示例:Qt 读写 SQLite 数据库

以下示例演示如何使用 QSqlDatabase + QSqlQuery 完成创建数据库、建表、插入数据、查询数据的完整流程。

1️⃣ 工程配置

.pro 文件中加入:

复制代码
复制代码
QT += sql

2️⃣ 代码示例 (main.cpp)

复制代码
复制代码
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 1. 连接数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("test.db"); // 数据库文件,不存在会自动创建
    if (!db.open()) {
        qDebug() << "无法打开数据库:" << db.lastError().text();
        return -1;
    }

    QSqlQuery query;

    // 2. 创建表
    if (!query.exec("CREATE TABLE IF NOT EXISTS person ("
                    "id INTEGER PRIMARY KEY AUTOINCREMENT,"
                    "name TEXT,"
                    "age INTEGER)")) {
        qDebug() << "创建表失败:" << query.lastError().text();
    }

    // 3. 插入数据
    query.prepare("INSERT INTO person (name, age) VALUES (?, ?)");
    query.addBindValue("Alice");
    query.addBindValue(25);
    if (!query.exec())
        qDebug() << "插入数据失败:" << query.lastError().text();

    query.addBindValue("Bob");
    query.addBindValue(30);
    if (!query.exec())
        qDebug() << "插入数据失败:" << query.lastError().text();

    // 4. 查询数据
    if (query.exec("SELECT id, name, age FROM person")) {
        while (query.next()) {
            int id = query.value(0).toInt();
            QString name = query.value(1).toString();
            int age = query.value(2).toInt();
            qDebug() << "ID:" << id << " Name:" << name << " Age:" << age;
        }
    } else {
        qDebug() << "查询失败:" << query.lastError().text();
    }

    return 0;
}

🔑 关键点说明

  • 数据库驱动

    • SQLite 驱动名是 QSQLITE,Qt 自带,无需额外安装。
  • 自动创建文件

    • db.setDatabaseName("test.db") 如果文件不存在会自动生成。
  • 参数绑定

    • 使用 query.preparequery.addBindValue 可以避免 SQL 注入问题。

🖼️ 如果需要 UI 表格展示

可以直接在 QTableView 里显示:

复制代码
复制代码
QSqlTableModel *model = new QSqlTableModel(this, db);
model->setTable("person");
model->select();
ui->tableView->setModel(model);

总结

  • 最通用QSqlDatabase + QSqlQuery,适合所有读写操作。

  • 快速显示表格QSqlTableModel + QTableView,适合简单的 CRUD 界面。

相关推荐
水煎包V:YEDIYYDS88818 分钟前
QT QML 实现的摇杆按钮,类似王者荣耀 左边方向导航键
qt·qml·摇杆按钮·导航键
计算机程序设计小李同学1 小时前
基于Python的在线零食购物商城系统的设计与实现
数据库·sqlite
2301_773730311 小时前
系统编程—线程
jvm
winfield8211 小时前
MCP 协议详解
开发语言·网络·qt
葛二蛋2 小时前
深入ClassLoader:从双亲委派到SPI
jvm
MicoZone2 小时前
jvm(更新中)
jvm
秦jh_3 小时前
【Qt】常用控件(上)
服务器·数据库·qt
刃神太酷啦3 小时前
C++ list 容器全解析:从构造到模拟实现的深度探索----《Hello C++ Wrold!》(16)--(C/C++)
java·c语言·c++·qt·算法·leetcode·list
水煎包V:YEDIYYDS8883 小时前
QT modbus 通信教程,把modbus封装到线程单例中,在线程内完成数据收发,解析。把重要数据以信号方式通知到qml层展示,解决UI卡顿
qt·modbus·线程服务
东华万里4 小时前
Release 版本禁用 assert:NDEBUG 的底层逻辑与效率优化
java·jvm·算法