☰
QT+MySQL垃圾分类查询系统源码:课程设计完整工程与避坑指南
2026/10/9 20:46:36 网站建设 项目流程

简介:这是一套基于Qt与MySQL搭建的垃圾分类查询系统完整源码,面向计算机相关专业学生及企业开发者,可作为课程设计、大作业、毕业设计或初期项目立项的实战参考。项目实现垃圾信息录入、查询、修改与删除等核心功能,并配有可回收物、有害垃圾、湿垃圾、干垃圾等分类图标资源,界面通过QSS样式表美化,支持跨平台运行。压缩包共46个文件,约109KB,包含8个cpp源文件与7个h头文件构成业务逻辑,6个ui界面文件与4个qss样式文件负责交互与视觉呈现,另有qrc资源文件、pro工程文件及README说明文档,结构清晰便于二次开发。目前已有95人学习下载。读者可从中掌握Qt界面布局、信号槽机制、MySQL数据库连接与增删改查操作,以及多主题样式切换的实现思路,适合作为入门练手与项目答辩的参考范例。

1. 从一次课程设计翻车说起:这套 QT+MySQL 垃圾分类查询系统到底能干什么

去年带一个课程设计小组,选题是“垃圾分类查询系统”,几个同学用 Python Tkinter 写了一版,界面丑到没法演示,查询逻辑还是硬编码在列表里,导师看了一眼就说“这不像一个完整的软件工程产物”。后来换了一套基于 QT+MySQL 的源码,编译运行之后,增删改查、分类浏览、样式切换全都有,答辩时直接被当作范本展示。这套基于QT+mysql搭建的垃圾分类查询系统源码+项目说明.zip就是那类“能跑、能改、能交差”的完整工程,不是那种只有几个界面文件的半成品。

它解决的核心问题很具体:把垃圾分类数据从静态文本变成可维护的数据库记录,再用 QT 做一套带交互的桌面客户端。适合计算机相关专业的课程大作业、毕业设计初期原型,也适合想练手 QT 数据库编程的开发者。源码里包含了garbage-query.pro、mainwindow.cpp、garbageinfo.cpp、query.cpp、addgarbage.cpp、modify.cpp、deletegarbage.cpp等完整模块,还有garbage.txt作为初始数据、多套.qss样式文件、图片资源和.ui界面文件。拿到手之后,你面对的不是一个黑匣子,而是一个可以逐行拆解的 C++ 桌面项目。

2. 工程结构与数据流:先看清 QT 项目怎么把 MySQL 接进来

2.1 从.pro到.ui:文件清单背后的模块划分

拿到压缩包解压后,根目录下会看到garbage-query.pro,这是 qmake 的工程文件,决定了编译时链接哪些库、包含哪些源文件。和它同级的main.cpp是程序入口,mainwindow.h/.cpp/.ui是主窗口,负责整体布局和菜单切换。menuwidge.h/.cpp/.ui是侧边或顶部导航组件,query、addgarbage、modify、deletegarbage、garbageinfo各自成对出现,分别对应查询、添加、修改、删除和垃圾分类信息展示五个功能页。

资源方面,image.qrc是 QT 的资源集合文件,把image/目录下的cquery.png、browse.png、modify.png、add.png、delete.png、可回收物.png、有害垃圾.png、湿垃圾.png、干垃圾.png等图标打包进可执行文件,避免运行时找不到图片。garbage.txt是初始数据文本,通常用来在数据库为空时导入基础分类记录。style.qss、ElegantDark.qss、Ubuntu.qss、MacOS.qss是不同风格的样式表,通过菜单或配置切换界面外观。

文件/目录作用是否必须保留
garbage-query.proqmake 工程配置,链接 MySQL 驱动是
mainwindow.*主窗口框架,承载页面切换是
query.*/addgarbage.*/modify.*/deletegarbage.*增删改查四个功能页是
garbageinfo.*垃圾分类详情展示是
menuwidge.*导航菜单组件是
image.qrc+image/图标与分类图片资源是
*.qss界面样式,可替换否,但建议保留
garbage.txt初始数据,用于建库后导入建议保留

这个划分方式很典型:一个主窗口 + 多个功能页 + 一个导航组件,每个功能页独立成类,通过信号槽和主窗口通信。你如果要加一个新功能,比如“批量导入”,就照着addgarbage复制一套,改类名和界面,再在主窗口里注册一下。

2.2 MySQL 连接与数据表设计:别让驱动成为第一道坎

QT 连接 MySQL 靠的是QSqlDatabase,但前提是 QT 编译时带了 MySQL 驱动,或者你手动编译了qsqlmysql插件。源码里通常会在mainwindow.cpp或单独的数据库工具类里写连接逻辑,常见写法是:

// 在 mainwindow.cpp 或独立的 dbhelper.cpp 中 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("127.0.0.1"); // 数据库地址,本机就写回环地址 db.setPort(3306); // MySQL 默认端口 db.setDatabaseName("garbage_db"); // 数据库名,需提前建好 db.setUserName("root"); // 用户名,按实际改 db.setPassword("123456"); // 密码,按实际改 if (!db.open()) { QMessageBox::critical(this, "连接失败", db.lastError().text()); return; }

这段代码的逻辑很直白:先注册 MySQL 驱动,再设置主机、端口、库名、账号密码,最后open()。如果失败,用lastError().text()把具体错误弹出来,而不是只提示“连接失败”。参数说明:setHostName填数据库所在机器,本机开发就写127.0.0.1;setDatabaseName必须和你在 MySQL 里CREATE DATABASE的名字一致;setUserName和setPassword按你本地 MySQL 的配置来,不要照抄。

数据表一般至少两张:一张存垃圾条目,一张存分类。常见建表语句如下:

-- 分类表 CREATE TABLE category ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL ); -- 垃圾条目表 CREATE TABLE garbage ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, category_id INT, description TEXT, FOREIGN KEY (category_id) REFERENCES category(id) );

category表存“可回收物、有害垃圾、湿垃圾、干垃圾”四类,garbage表存具体垃圾名称和描述,通过category_id关联。查询时用JOIN把分类名带出来,界面上就能显示“电池 → 有害垃圾”这样的结果。如果你把garbage.txt里的数据导入,注意文本编码用 UTF-8,否则中文会变问号。

提示:QT 的 MySQL 驱动不是默认就有的,如果QSqlDatabase::drivers()里没有QMYSQL,需要自己编译驱动插件,或者换用QSQLITE先跑通逻辑再换回 MySQL。

3. 编译运行与功能验证:从零把项目跑起来的完整步骤

3.1 环境准备与 qmake 编译

这套源码是 qmake 工程,不是 CMake,所以用 QT Creator 打开garbage-query.pro最省事。环境上需要:QT 5.x(建议 5.12 以上)、MySQL 5.7 或 8.0、对应版本的 MySQL 驱动。如果你用的是 QT 5.15 自带 MinGW 编译套件,MySQL 驱动可能需要单独处理,这是第一个容易翻车的地方。

编译步骤:

# 1. 用 QT Creator 打开 garbage-query.pro # 2. 选择构建套件(Kit),比如 Desktop Qt 5.15.2 MinGW 64-bit # 3. 在项目设置里确认 MySQL 库路径已加入 # 4. 点击“构建”按钮,或命令行执行: qmake garbage-query.pro make # Linux/macOS mingw32-make # Windows MinGW

如果编译报错“undefined reference tomysql_init”之类,说明链接器找不到 MySQL 客户端库。需要在.pro文件里加:

LIBS += -L/usr/lib/x86_64-linux-gnu -lmysqlclient INCLUDEPATH += /usr/include/mysql

Windows 下路径换成你 MySQL 安装目录下的lib和include。这一步没有统一答案,因为每个人 MySQL 装的位置不一样,但思路就是告诉 qmake 去哪里找头文件和库文件。

3.2 建库、导数据与界面功能走查

编译通过后,先别急着点运行,先把数据库准备好。用 MySQL 命令行或图形工具执行:

CREATE DATABASE garbage_db DEFAULT CHARACTER SET utf8mb4; USE garbage_db; -- 然后执行上面提到的建表语句 -- 再把 garbage.txt 里的数据整理成 INSERT 语句导入

garbage.txt的格式通常是每行“垃圾名称,分类,描述”或者类似结构,导入前先看一眼分隔符。如果它本身就是 SQL 插入语句,直接source garbage.txt即可;如果是纯文本,写个简单的 Python 脚本转成INSERT:

# 将 garbage.txt 转为 SQL 插入语句 with open('garbage.txt', 'r', encoding='utf-8') as f: lines = f.readlines() with open('import.sql', 'w', encoding='utf-8') as out: for line in lines: parts = line.strip().split(',') if len(parts) >= 2: name, category = parts[0], parts[1] desc = parts[2] if len(parts) > 2 else '' out.write(f"INSERT INTO garbage (name, category_id, description) " f"SELECT '{name}', id, '{desc}' FROM category WHERE name='{category}';\n")

这段脚本按逗号切分,第一列是垃圾名,第二列是分类名,第三列是描述。INSERT ... SELECT的写法是为了根据分类名动态取category_id,避免手动查 ID。导入后,运行程序,依次点“查询”“添加”“修改”“删除”,确认每个页面都能正常读写数据库。查询页一般支持按名称模糊搜索,添加页要校验空值,修改页要先选中再改,删除页要有二次确认。这些交互细节在query.cpp、addgarbage.cpp里都能找到对应实现。

注意:如果界面中文显示乱码,检查源文件编码和数据库连接字符集,通常在连接后执行SET NAMES utf8mb4可以解决。

4. 避坑与排查:这套源码最容易卡住的五个地方

4.1 驱动加载失败:QMYSQL driver not loaded

现象:程序启动后弹窗提示“QMYSQL driver not loaded”,或者QSqlDatabase::drivers()输出里没有QMYSQL。原因通常是 QT 安装时没有编译 MySQL 驱动插件,或者插件路径不对。解决:先确认 QT 安装目录下plugins/sqldrivers/里有没有qsqlmysql.dll(Windows)或libqsqlmysql.so(Linux)。如果没有,需要手动编译驱动,或者改用QSQLITE先把业务逻辑跑通,再回头处理 MySQL 驱动。

4.2 编译时报 MySQL 头文件找不到

现象:fatal error: mysql.h: No such file or directory。原因:.pro里没有加INCLUDEPATH,或者 MySQL 开发包没装。解决:Linux 下装libmysqlclient-dev,Windows 下确认 MySQL 安装目录下有include文件夹,然后在.pro里补上路径。路径不要写死成别人的机器,用相对路径或环境变量更稳。

4.3 增删改查操作后界面不刷新

现象:添加一条记录后,查询页还是旧数据;删除后列表里还在。原因:QT 的QSqlTableModel或QSqlQueryModel没有重新select(),或者用了QSqlQuery执行后没有同步模型。解决:在每次增删改之后调用model->select()重新查询,或者用QSqlTableModel::submitAll()并检查返回值。如果用的是自定义QSqlQuery,记得在exec()之后把结果重新绑定到界面控件。

4.4 中文乱码:数据库里是问号,界面显示方块

现象:插入“电池”变成“??”,或者界面显示“锟斤拷”。原因:数据库、表、连接三处字符集不一致。解决:建库时用utf8mb4,建表时指定DEFAULT CHARSET=utf8mb4,QT 连接后执行query.exec("SET NAMES utf8mb4")。另外确认源文件保存为 UTF-8 无 BOM,QT Creator 默认就是 UTF-8,但 Windows 下用记事本改过就可能变。

4.5 样式表加载后界面错乱

现象:换了ElegantDark.qss之后,按钮文字看不清,或者布局挤在一起。原因:样式表里的选择器太宽泛,或者和.ui文件里的内联样式冲突。解决:先注释掉.qss里的全局*选择器,只针对具体控件类设置;检查.ui里有没有手动设置styleSheet属性,有的话会覆盖外部样式表。调试时可以用qApp->setStyleSheet("")临时清空,确认问题来源。

5. 二次开发与数据验证:把课程设计变成能讲清楚的项目

5.1 加一个“批量导入”功能页

如果你想让这个项目在答辩时更有亮点,加一个批量导入页是最划算的。照着addgarbage复制一套文件,改类名为BatchImport,界面放一个QTextEdit和一个“导入”按钮。核心逻辑是逐行解析文本,拼成INSERT语句,用事务提交:

// batchimport.cpp 中的导入槽函数 void BatchImport::onImportClicked() { QString text = ui->textEdit->toPlainText(); QStringList lines = text.split('\n', Qt::SkipEmptyParts); QSqlQuery query; query.exec("START TRANSACTION"); // 开启事务,提升批量插入速度 for (const QString &line : lines) { QStringList parts = line.split(','); if (parts.size() < 2) continue; query.prepare("INSERT INTO garbage (name, category_id, description) " "SELECT ?, id, ? FROM category WHERE name = ?"); query.addBindValue(parts[0].trimmed()); query.addBindValue(parts.size() > 2 ? parts[2].trimmed() : ""); query.addBindValue(parts[1].trimmed()); if (!query.exec()) { qDebug() << "插入失败:" << query.lastError().text(); } } query.exec("COMMIT"); // 提交事务 QMessageBox::information(this, "完成", "批量导入结束"); }

START TRANSACTION和COMMIT把多条插入包成一个事务,比逐条提交快很多。prepare+addBindValue是参数化查询,能防止引号导致的 SQL 错误,也避免注入。SELECT ... FROM category WHERE name = ?是为了根据分类名拿id,如果分类名写错,这条插入就会失败,但不会影响其他行。导入完成后,记得在主窗口的导航里加上这个新页面的入口。

5.2 用 SQL 直接验证数据一致性

界面操作多了之后,数据可能对不上。与其在界面上反复点,不如直接查数据库:

-- 检查有没有垃圾条目关联了不存在的分类 SELECT g.id, g.name, g.category_id FROM garbage g LEFT JOIN category c ON g.category_id = c.id WHERE c.id IS NULL; -- 统计每个分类下的垃圾数量 SELECT c.name, COUNT(g.id) AS total FROM category c LEFT JOIN garbage g ON g.category_id = c.id GROUP BY c.id, c.name;

第一条查孤儿记录,第二条看分类分布。如果第一条有结果,说明category_id指向了已删除的分类,界面上可能显示空白分类名。第二条能帮你确认数据导入是否完整,比如“有害垃圾”下面只有两三条,那可能是garbage.txt没导全。这种验证方式比在界面上翻页快得多,也适合在答辩时展示你对数据完整性的理解。

5.3 样式切换与打包发布

源码里带了四套.qss,你可以在主窗口加一个下拉框,读取:/styles/下的文件并qApp->setStyleSheet()。打包发布时,Windows 下用windeployqt把 QT 依赖库拷到可执行文件旁边,Linux 下用linuxdeployqt或手动整理.so。MySQL 驱动插件也要一起带上,否则换台机器就报“driver not loaded”。我一般会在发布前把数据库连接信息抽到一个config.ini里,避免硬编码密码,也方便别人改。

从那以后我每次拿到这类 QT+MySQL 的课程设计源码,都先跑一遍QSqlDatabase::drivers()确认驱动,再建库导数据,最后才动界面。这套流程走下来,基本不会在答辩现场翻车。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询