QtMachineDog:告别重复造轮子,Qt 快速开发脚手架
"不管多小的 Qt 项目,总有一堆琐碎但必要的事情要做。"
开源地址:https://gitee.com/Tlink/machine
作为一个 Qt 开发者,你是否经历过:
- 每次新建项目都要重写一遍日志系统?
- 程序崩溃后用户说"不知道发生了什么",而你根本拿不到堆栈?
- 配置文件散落在各处,版本升级后配置丢失?
- HTTP 请求封装写了无数次,每次都要重新解析 JSON?
- 简单的数据 CRUD 操作,却要重写大量样板代码?
这些问题和具体业务无关 ,却每个项目都要面对 。这就是我做 QtMachineDog 的原因------把通用的事一次做好,让开发者专注于业务逻辑。
简单介绍
QtMachineDog 是一个基于 CMake 的 Qt 快速开发框架/脚手架。它不是试图替代 Qt,而是填补"项目初始化"到"业务开发"之间的空白------你不再需要为每个项目复制粘贴基础设施代码。
核心定位:开箱即用的项目骨架,而非重量级业务框架
功能亮点(即拿即用)
| 功能模块 | 解决的问题 | 亮点特性 |
|---|---|---|
| 📜 日志系统 | 告别 qDebug() 满天飞 | 分级日志、文件轮转、多线程安全 |
| 💥 全局异常处理 | 崩溃无迹可寻 | 自动捕获崩溃信号,生成完整堆栈日志,再也不怕用户说"程序突然没了" |
| ⚙️ 配置中心 | 配置管理混乱 | 全局统一的配置文件管理,支持版本兼容、自动备份 |
| 💾 持久化数据 | 数据存储重复造轮子 | 封装好的本地存储方案,业务层直接调用 |
| 🌐 HTTP 模块 | 网络请求代码冗余 | 基于现代 Qt 网络栈的请求封装,自动 JSON 解析、错误处理、超时重试 |
| 🗃️ 数据 CRUD 模板 | 每次都要写增删改查 | 可复制的业务模板,复制粘贴即可用于新模块,遵循统一设计模式 |
| 🏷️ 版本管理 | 版本号混乱、自动更新困难 | 语义化版本管理,内置更新检查接口 |
| 🖥️ Self-Host Web 服务 | 需要内嵌 HTTP 服务 | 内置轻量级 Web Server,可用于本地 API 或监控面板 |
| 🎨 FontAwesome 集成 | 图标资源管理麻烦 | 内置 FontAwesome,支持动态颜色/大小控制,无需准备多套图标资源 |
| 🔗 动态库管理 | DLL/SO 加载繁琐 | 统一的动态链接库加载、热插拔支持 |
| 🔧 CMake 现代化 | 跨平台构建头疼 | 全 CMake 构建,支持 Windows/Linux/macOS,第三方依赖自动拉取 |
💡 谁需要这个项目?
✅ 个人开发者 :快速启动 Side Project,不用每次都配基础设施
✅ 小团队 :统一项目结构,新人上手成本降低 80%
✅ 企业项目 :作为基础脚手架,确保所有项目有统一的日志、崩溃收集标准、快速开发示例
✅ 学习者:通过实战代码学习 Qt 工程化最佳实践(异常处理、CMake 模块化等)
项目结构遵循模块化设计,你可以:
- 全量使用:作为完整脚手架启动新项目
- 按需摘取:只拷贝你需要的模块(如只拿 Crash Handler 和 Logger)到现有项目
🔍 几个值得单独说的亮点
1. 崩溃处理:让"玄学 Bug"现形
cpp
void ExceptionHandler::setup()
{
try {
spdlog::info("Setting up exception handlers...");
// 1. 设置 C++ 异常处理
originalTerminateHandler = std::get_terminate();
std::set_terminate(&ExceptionHandler::terminateHandler);
// 2. 设置 Qt 消息处理
originalQtMessageHandler = qInstallMessageHandler(&ExceptionHandler::qtMessageHandler);
// 3. 设置信号处理 - 关键:捕获段错误等
std::signal(SIGSEGV, ExceptionHandler::signalHandler); // 段错误
std::signal(SIGABRT, ExceptionHandler::signalHandler); // abort()
std::signal(SIGFPE, ExceptionHandler::signalHandler); // 浮点异常
std::signal(SIGILL, ExceptionHandler::signalHandler); // 非法指令
// 注意:不要捕获 SIGTERM 和 SIGINT,让程序可以正常退出
// std::signal(SIGTERM, ExceptionHandler::signalHandler); // 终止信号
// std::signal(SIGINT, ExceptionHandler::signalHandler); // Ctrl+C
spdlog::info("Exception handlers installed successfully");
} catch (const std::exception& e) {
spdlog::error("Failed to install exception handlers: {}", e.what());
}
}
2. fontawesome字体图标选择与使用
cpp
ui->btnErrorTest->setIcon(FontManager::ins().icon(0xf06a, {24,24}, QColor(200,0,0)));
ui->btnIconChoose->setIcon(FontManager::ins().icon(0xf2b4, {24,24}, QColor(0,0,255)));
ui->btnConfigLoad->setIcon(FontManager::ins().icon(0xf1de, {24,24}, QColor("#228B22")));
ui->btnMylib->setIcon(FontManager::ins().icon(0xf0e7, {24,24}, QColor(255,0,0)));
3. CRUD 模板:业务开发的复制粘贴神器
项目提供了一套基于 Qt Model/View 的通用数据操作模板,开发新模块时,复制模板文件夹,改改类名就能用,包含:
- 数据模型定义
- 数据库操作接口
- 视图绑定逻辑
- 基础的增删改查 UI
4. SelfHost Web服务-可内嵌 HTTP 服务 | 内置轻量级 Web Server,可用于本地 API 或监控面板
💬 写在最后
QtMachineDog 不是一个大而全的框架,而是一个务实的解决方案 ------解决那些每个 Qt 项目都会遇到、却没有人系统整理过的问题。
如果你也曾为"又要重写日志系统"而烦恼,不妨试试这个框架。把重复的事情交给 MachineDog,你专心做独一无二的功能。
🔧下一步集成asp.net core发布后的selfhost
使用SignalR,通过api来接受设备的实时状态,并轻量的web输出到网络
asp.net core相关的处理数据api demo
既保证了工业设备的稳重(桌面程序),又能使数据流动变得轻盈(web程序)
如果对你有帮助有启发,请帮忙转发点赞,star,您的支持是我的最大动力
开源地址:https://gitee.com/Tlink/machine
#Qt #Qt开发 #CMake #开源项目 #C++ #跨平台开发