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表含id、name、create_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. 构造函数 —— 纯代码搭建 UIMainWindow::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())); } }使用preparebindValue是推荐的做法既能防止 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(); }五、运行与测试步骤在 Qt Creator 中新建Qt Widgets Application取消“创建界面”复选框。将上述代码分别复制到mainwindow.h、mainwindow.cpp和main.cpp并修改.pro文件添加sql。构建并运行。依次点击三个按钮先点【连接 建表】看到成功提示。再点【插入一条数据】数据入库。最后点【查询所有数据】文本框会打印出刚插入的记录。你可以多次点击插入每次都会增加一条新纪录查询时会显示所有。六、注意事项与小技巧数据库文件位置若不指定路径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?pwd1234 提取码: 1234