当前位置: 首页 > news >正文

Qt5.6.2 + SQLite 纯代码入门实战:从零搭建数据库管理小工具

Qt5.6.2 + SQLite 纯代码入门实战:从零搭建数据库管理小工具

手把手教你用纯代码(无 UI 设计器)在 Qt 中连接 SQLite、建表、插入与查询数据


一、写在前面

很多 Qt 初学者第一次接触数据库时,往往被各种繁琐的配置、IDE 设置或 UI 设计器搞得头晕。其实,用纯代码的方式来操作 SQLite 非常简单且直观,不仅有助于理解底层逻辑,还能让你轻松移植到任何项目中。

本文将带你从零实现一个完整的 Qt + SQLite 演示程序——全部使用 C++ 代码创建界面和数据库逻辑,不依赖.ui文件。代码基于Qt 5.6.2(高版本同样兼容),最终效果是一个带有三个按钮和日志输出框的小窗口,能够连接数据库、插入测试数据、查询并显示所有记录。


二、项目效果预览

运行程序后,你会看到如下界面:

  • 【连接 & 建表】:打开(或创建)test.db数据库文件,并自动创建test_table表(含idnamecreate_time字段)。

  • 【插入一条数据】:向表中插入一条预设的测试数据(名称固定,时间取当前时刻)。

  • 【查询所有数据】:读取表中所有记录,并在下方的文本框中以格式化文本显示。

每一步操作都会在文本框内输出对应的成功/失败日志,方便调试。


三、项目结构一览

本项目由三个核心文件组成(省略了.pro工程文件):

SqliteDemo/ ├── main.cpp # 程序入口 ├── mainwindow.h # MainWindow 类声明(含 UI 控件指针) └── mainwindow.cpp # 构造函数、析构函数、三个槽函数实现

我们没有使用mainwindow.ui,所有界面控件均在 C++ 中new出来,并通过布局管理器组装。


四、核心代码详解

1. 头文件mainwindow.h—— 声明控件与槽

#ifndef MAINWINDOW_H #define MAINWINDOW_H ​ #include <QMainWindow> #include <QPushButton> #include <QTextEdit> #include <QVBoxLayout> ​ class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); ​ private slots: void slotConnectDb(); void slotInsertData(); void slotQueryData(); ​ private: // 界面控件(全部手工创建) QPushButton* m_btnConnect; QPushButton* m_btnInsert; QPushButton* m_btnQuery; QTextEdit* m_textEdit; QWidget* m_centralWidget; QVBoxLayout* m_mainLayout; }; ​ #endif // MAINWINDOW_H
  • 我们声明了三个按钮和一个只读文本框,以及承载它们的容器和布局。

  • 三个槽函数分别对应三个按钮的点击事件。


2. 构造函数 —— 纯代码搭建 UI

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 窗口基础设置 setWindowTitle("Qt5.6.2 + SQLite 纯代码Demo"); resize(600, 400); ​ // 创建中央部件和垂直布局 m_centralWidget = new QWidget(this); m_mainLayout = new QVBoxLayout(m_centralWidget); ​ // 创建三个按钮 m_btnConnect = new QPushButton("连接 & 建表", this); m_btnInsert = new QPushButton("插入一条数据", this); m_btnQuery = new QPushButton("查询所有数据", this); ​ // 创建文本框(只读) m_textEdit = new QTextEdit(this); m_textEdit->setReadOnly(true); ​ // 将控件加入布局 m_mainLayout->addWidget(m_btnConnect); m_mainLayout->addWidget(m_btnInsert); m_mainLayout->addWidget(m_btnQuery); m_mainLayout->addWidget(m_textEdit); ​ // 设置为中心部件(QMainWindow 必须) setCentralWidget(m_centralWidget); ​ // 信号槽连接 connect(m_btnConnect, &QPushButton::clicked, this, &MainWindow::slotConnectDb); connect(m_btnInsert, &QPushButton::clicked, this, &MainWindow::slotInsertData); connect(m_btnQuery, &QPushButton::clicked, this, &MainWindow::slotQueryData); }

要点

  • 所有控件都通过new在堆上创建,并指定this为父对象,Qt 会自动管理内存释放。

  • 布局管理器QVBoxLayout让控件纵向排列,无需手动设置坐标。

  • 信号槽使用现代语法(函数指针),编译期检查,更安全。


3. 槽函数slotConnectDb—— 连接数据库与建表

void MainWindow::slotConnectDb() { // 获取 SQLite 驱动并设置数据库文件名 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("test.db"); // 将生成在程序运行目录下 ​ if (!db.open()) { m_textEdit->append(QString("❌ 数据库打开失败:%1").arg(db.lastError().text())); return; } m_textEdit->append("✅ SQLite 数据库连接成功"); ​ // 创建表(若不存在) QSqlQuery query; QString createTableSql = R"( CREATE TABLE IF NOT EXISTS test_table ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, create_time DATETIME ) )"; ​ if (query.exec(createTableSql)) { m_textEdit->append("✅ 数据表 test_table 已就绪"); } else { m_textEdit->append(QString("❌ 建表失败:%1").arg(query.lastError().text())); } }
  • addDatabase("QSQLITE")会注册一个默认连接(未命名),后续可通过QSqlDatabase::database()获取。

  • setDatabaseName("test.db")仅指定文件名,若不存在则自动创建。

  • 建表语句使用了原始字符串字面量R"(...)",避免转义混乱,可读性更佳。

  • 若表已存在,IF NOT EXISTS确保不会报错。


4. 槽函数slotInsertData—— 插入数据(预编译)

void MainWindow::slotInsertData() { QSqlDatabase db = QSqlDatabase::database(); if (!db.isOpen()) { m_textEdit->append("⚠️ 请先点击【连接 & 建表】"); return; } ​ QSqlQuery query; query.prepare("INSERT INTO test_table(name, create_time) VALUES (:name, :ctime)"); query.bindValue(":name", "纯代码UI测试数据"); query.bindValue(":ctime", QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")); ​ if (query.exec()) { m_textEdit->append("✅ 数据插入完成"); } else { m_textEdit->append(QString("❌ 插入失败:%1").arg(query.lastError().text())); } }
  • 使用prepare+bindValue是推荐的做法,既能防止 SQL 注入,也能提高重复执行效率。

  • 这里我们插入了固定的名称和当前时间,实际开发中可替换为从界面输入获取。


5. 槽函数slotQueryData—— 查询并展示

void MainWindow::slotQueryData() { QSqlDatabase db = QSqlDatabase::database(); if (!db.isOpen()) { m_textEdit->append("⚠️ 请先点击【连接 & 建表】"); return; } ​ m_textEdit->append("\n---------- 查询结果 ----------"); QSqlQuery query("SELECT id, name, create_time FROM test_table"); ​ int rowCount = 0; while (query.next()) { int id = query.value("id").toInt(); QString name = query.value("name").toString(); QString ctime = query.value("create_time").toString(); ​ QString line = QString("ID:%1 名称:%2 时间:%3") .arg(id).arg(name).arg(ctime); m_textEdit->append(line); rowCount++; } ​ if (rowCount == 0) { m_textEdit->append("暂无数据"); } }
  • 直接执行 SQL 查询语句,并循环遍历结果集。

  • 通过query.value("字段名")获取数据,自动转换为对应类型。

  • 将每条记录格式化为一行文本,追加到文本框。


6. 工程文件.pro—— 加入 SQL 模块

QT += core gui sql greaterThan(QT_MAJOR_VERSION, 4): QT += widgets ​ TARGET = SqliteDemo TEMPLATE = app ​ SOURCES += main.cpp mainwindow.cpp HEADERS += mainwindow.h # FORMS += mainwindow.ui # 我们不用 UI 文件,注释掉

关键点:必须添加sql模块(QT += sql),否则无法使用QSqlDatabase等类。


7. 主函数main.cpp(标准写法)

#include <QApplication> #include "mainwindow.h" ​ int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }

五、运行与测试步骤

  1. 在 Qt Creator 中新建Qt Widgets Application,取消“创建界面”复选框。

  2. 将上述代码分别复制到mainwindow.hmainwindow.cppmain.cpp,并修改.pro文件添加sql

  3. 构建并运行。

  4. 依次点击三个按钮:

    • 先点【连接 & 建表】,看到成功提示。

    • 再点【插入一条数据】,数据入库。

    • 最后点【查询所有数据】,文本框会打印出刚插入的记录。

你可以多次点击插入,每次都会增加一条新纪录,查询时会显示所有。


六、注意事项与小技巧

  • 数据库文件位置:若不指定路径,test.db会生成在程序工作目录(通常是构建目录或可执行文件同级)。若希望固定位置,可使用绝对路径或QStandardPaths

  • 连接管理:本例使用默认连接(未命名),若有多个数据库需使用addDatabase的第二个参数指定连接名,并通过QSqlDatabase::database("连接名")获取。

  • 错误处理:所有数据库操作都检查了lastError(),并输出到文本框,便于调试。

  • 纯代码 vs UI 设计器:纯代码让逻辑清晰,且容易版本控制;设计器适合快速原型。根据个人喜好选择,本例旨在展示纯代码的可行性。

  • Qt 版本兼容:代码基于 Qt 5.6.2,在 Qt 5.15、Qt 6.x 上同样可以编译运行(注意QSqlDatabase::addDatabase用法不变)。


七、扩展思考

掌握以上基础后,你可以轻松扩展:

  • 添加删除更新功能。

  • QTableView配合QSqlTableModel展示数据,实现更强大的图形界面。

  • 将数据库连接封装为单例类,全局共享。

  • 处理事务(transaction()/commit()/rollback())。


八、结语

通过这个简单的例子,我们完成了Qt + SQLite 的纯代码入门。不依赖任何可视化设计工具,只用 C++ 就构建了一个具备数据库操作的小应用。希望这篇文章能帮助你快速上手 Qt 数据库编程,为后续更复杂的项目打下坚实基础。

如果你有任何问题或建议,欢迎在评论区交流讨论!


本文配套源码已完整贴出,你也可以直接复制到自己的 Qt 项目中运行。祝编程愉快! 🚀

通过网盘分享的文件:SqliteDemo.zip
链接: https://pan.baidu.com/s/1VnT1qfcK8syxsFNZudTjkA?pwd=1234 提取码: 1234

http://www.jsqmd.com/news/1152723/

相关文章:

  • 2026 AI短视频全链路实战教程:1天批量生产10条爆款视频,普通开发者也能实现内容创业!
  • SWIDERM身体护理怎么样
  • 3分钟掌握m3u8视频下载神器:跨平台M3U8下载工具完全指南
  • 南宁闲置怎么处理更安心?认准本地二奢实体老店
  • 电商日报分析助手 各类运营与内容工具分环节使用思路分享
  • 踩坑日记:解决 VS Code ESLint 插件 `Cannot find native binding` 终极指南
  • 【大模型】对齐机制(上):MLP vs Q-Former,视觉特征到底怎么塞进 LLM?|多模态大模型专栏④
  • Python 程序员转行 AI 避坑指南:如何从“写死逻辑”走向“拥抱概率”?
  • 东莞仿花岗岩透水砖销售厂家
  • 高斯过程回归 3 大核心挑战:计算复杂度 O(n³)、核函数选择、超参数优化
  • 混合办公与多云时代,第一线 DYXnet 为企业构建更稳健的云网安全体系
  • IC、ASIC、SoC、MPU、MCU 5大芯片选型指南:从功耗、成本到开发周期对比
  • STM32与TPD2015FN的工业负载控制方案
  • X射线聚焦系统
  • 2026款免滤破壁机打磨精细,打出的豆浆入口丝滑
  • Kaggle 多分类预测:Optuna 微调 XGBoost/CatBoost 参数,CV 分数提升 0.01+
  • 百考通,任务书一键生成,让学术研究起步即规范
  • 3步掌握PowerToys Everything插件:Windows文件搜索效率提升300%的实战指南
  • 终极Minecraft矿物探测模组:Advanced X-Ray完整使用指南
  • 终极星露谷物语效率革命:5个必备SMAPI模组彻底改变农场生活
  • PCIe 设备分类实战:5种常见Class Code(03/02/01/06/0C)的识别与配置
  • TLA2518与TM4C129ENCPDT构建高精度信号采集系统
  • 轨道交通联合仿真建设,体系规划先于仿真实施
  • 2026化学行业AI智能体服务机构盘点 化工研发安全生产合规智能体选型手册
  • AI 电动搅拌机智能功率 覆盖电机驱动、电源管理完整选型方案
  • 全平台QQ数据库解密终极指南:3分钟找回你丢失的聊天记录
  • 5分钟拿回你的QQ聊天记录:全平台数据库解密完整指南
  • Stable Diffusion模型推荐终极指南(附Hugging Face下载热度TOP20+ComfyUI兼容性矩阵表)
  • 龙虾3.13部署避坑指南:环境、配置与命令失效的深层根因
  • 纯生信分析≠灌水!这些无实验文章纯生信照样冲高分!