Qt的数据库模块介绍,Qt访问SQLite详细示例

在 Qt 中访问数据库,官方推荐使用 Qt SQL 模块 ,主要通过 QSqlDatabaseQSqlQueryQSqlTableModel 等类来操作各种数据库(SQLite、MySQL、PostgreSQL、Oracle 等)。

对于轻量级本地存储,SQLite 是最常用的数据库之一,因为它无需独立服务器跨平台零配置

下面详细介绍 访问方式SQLite Demo


1️⃣ Qt 访问数据库的方式

方式 特点 适用场景
QSqlDatabase + QSqlQuery 直接操作 SQL 语句,灵活、通用 需要执行复杂 SQL 或自定义查询
QSqlTableModel / QSqlQueryModel 模型/视图模式,直接绑定到 UI(如 QTableView) 数据表直接展示、增删改查
QSqlRelationalTableModel 支持外键关联 多表关系操作

👉 SQLite 属于文件型数据库,Qt 内置驱动名为 QSQLITE,只要系统有 SQLite 库即可直接使用。


2️⃣ SQLite 示例 Demo(QSqlDatabase + QSqlQuery)

下面提供一个完整的 Qt Demo ,包括创建数据库、建表、插入数据、查询数据

📂 文件结构

假设使用 Qt Creator + Widgets 项目

  • main.cpp

  • mainwindow.h / mainwindow.cpp (可选)

✅ main.cpp

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

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

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

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

    query.bindValue(":name", "Bob");
    query.bindValue(":age", 30);
    query.exec();

    // 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 true;
}

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

    if (initDatabase()) {
        qDebug() << "数据库初始化完成";
    }

    return a.exec();
}

⚙️ pro 文件配置

确保在 .pro 文件中加入 Qt SQL 模块:

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

3️⃣ 补充:用 QSqlTableModel 绑定到 UI

如果需要在 QTableView 中直接显示数据:

复制代码
cpp 复制代码
#include <QSqlTableModel>
#include <QTableView>

QSqlTableModel *model = new QSqlTableModel(this);
model->setTable("person");
model->select();  // 查询所有数据

QTableView *view = new QTableView;
view->setModel(model);
view->show();

这样可以直接进行增删改查,无需手写 SQL。


💡总结

方式 优点 缺点
QSqlQuery 灵活、可执行任何 SQL 语句 需要自己写 SQL
QSqlTableModel 快速绑定 UI,适合简单表操作 对复杂查询支持不足

👉 推荐方案

  • 简单数据展示QSqlTableModel + QTableView

  • 复杂逻辑/多表查询QSqlQuery

相关推荐
m0_613856294 小时前
mysql如何利用事务隔离级别解决特定业务冲突_mysql隔离方案选型
jvm·数据库·python
Adios7945 小时前
VPR:Pitts50K和Norland数据集下载
数据库
东风破1375 小时前
DM用户权限、表、约束等对象的基本操作,SQL日志的开启介绍
数据库·sql·dm达梦数据库
收获不止数据库5 小时前
达梦9发布会归来:AI 时代,我们需要一款什么样的数据库?
数据库·人工智能·ai·语言模型·数据分析
小宇的天下5 小时前
Virtuoso GUI 界面中的关键模块定义
数据库
bqq198610265 小时前
MySQL 5.7 与 MySQL 8.0 的主要区别
数据库·mysql
Elastic 中国社区官方博客6 小时前
Elastic-caveman : 在不损失 Elastic 最佳效果的情况下,将 AI 响应 tokens 减少64%
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·全文检索
互联网推荐官6 小时前
上海软件定制开发全流程拆解:需求分析、技术选型与交付管理的工程实践
大数据·数据库·需求分析
专注API从业者7 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
大迪deblog7 小时前
系统架构师-数据库-数据库设计
数据库·oracle·系统架构