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. 构造函数 —— 纯代码搭建 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(); }五、运行与测试步骤
在 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?pwd=1234 提取码: 1234
