告别重复造轮子,Qt 快速开发脚手架

简单介绍

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"现形(全局异常处理)

复制代码
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字体图标选择与使用

复制代码
    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 模板:业务开发的复制粘贴神器(本程序使用的数据库为sqlite)

项目提供了一套基于 Qt Model/View 的通用数据操作模板,开发新模块时,复制模板文件夹,改改类名就能用,包含:

  • 数据模型定义
  • 数据库操作接口
  • 视图绑定逻辑
  • 基础的增删改查 UI
复制代码
void UserDao::initTable()
{
    QSqlQuery q(DbManager::instance().db());
    q.exec("CREATE TABLE IF NOT EXISTS user("
           "id   INTEGER PRIMARY KEY AUTOINCREMENT,"
           "name TEXT NOT NULL,"
           "username TEXT NOT NULL,"
           "email TEXT NULL,"
           "pwd TEXT NULL,"
           "picpath TEXT NULL,"
           "status  TEXT NOT NULL,"
           "registertime TEXT NULL,"
           "lastlogintime TEXT NULL,"
           "phonenum TEXT NULL,"
           "notes TEXT NULL,"
           "age  INTEGER,"
           "roles INTEGER,"
           "gender INTEGER)");

}

int UserDao::addUser(const User &user)
{
    QSqlQuery q(DbManager::instance().db());
    q.prepare("INSERT INTO user(name,username,email,picpath,status,registertime,lastlogintime,phonenum,age,roles,gender,pwd,notes) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");
    q.addBindValue(user.name);
    q.addBindValue(user.username);
    q.addBindValue(user.email);
    q.addBindValue(user.picpath);
    q.addBindValue(user.status);
    q.addBindValue(user.registertime);
    q.addBindValue(user.lastlogintime);
    q.addBindValue(user.phonenum);
    q.addBindValue(user.age);
    q.addBindValue(user.roles);
    q.addBindValue(user.gender);
    q.addBindValue(user.pwd);
    q.addBindValue(user.notes);
    if (!q.exec()) {
        qWarning() << "insert user error:" << q.lastError().text();
       // spdlog::error("insert user error:"+ q.lastError().text().toStdString());
        return -1;
    }
    return q.lastInsertId().toInt();
}

bool UserDao::deleteUser(int id)
{
    QSqlQuery q(DbManager::instance().db());
    q.prepare("DELETE FROM user WHERE id=?");
    q.addBindValue(id);
    return q.exec();
}
bool UserDao::updateUser(const User &user)
{
    if (user.id <= 0) return false;
    QSqlQuery q(DbManager::instance().db());
    q.prepare("UPDATE user SET name=?,username=?,email=?,picpath=?,status=?,registertime=?,lastlogintime=?,phonenum=?,age=?,roles=?,gender=?,pwd=?,notes=? WHERE id=?");
    q.addBindValue(user.name);
    q.addBindValue(user.username);
    q.addBindValue(user.email);
    q.addBindValue(user.picpath);
    q.addBindValue(user.status);
    q.addBindValue(user.registertime);
    q.addBindValue(user.lastlogintime);
    q.addBindValue(user.phonenum);
    q.addBindValue(user.age);
    q.addBindValue(user.roles);
    q.addBindValue(user.gender);
    q.addBindValue(user.pwd);
    q.addBindValue(user.notes);
    q.addBindValue(user.id);
    return q.exec();
相关推荐
香芋芋圆19 分钟前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
蓝祁子yoky30 分钟前
Qt学习日记 Day13:网络编程(一)-TCP基础与Socket实战
网络·qt·学习
小熊恋旧1 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合1 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J1 小时前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
will_net1 小时前
apollo 站点部署&C#接入
开发语言·c#·apollo
晗夜未央2 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>2 小时前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
努力努力再努力wz3 小时前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua
飞浪纪元[FWC–FE]3 小时前
从零到一键绿:Qt 5.14.2 + VS2019 开发环境搭建、Kit 套件配置与构建错误修复完全手册
开发语言·qt