告别重复造轮子,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();
相关推荐
Beyond_System|系统之外25 分钟前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55231 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
Bruce_Liuxiaowei3 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
aramae5 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
辛迪聊物业数字化6 小时前
智慧物业管理平台架构实践:从SaaS物业云到商管系统的全模块落地
大数据·微服务·php
码行山野赴时序归途8 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
景熙55238 小时前
单体项目编写思路和落地形式
java·开发语言
计算机毕设定制辅导-无忧学长9 小时前
《基于SpringBoot的未成年人健康知识科普平台的设计与实现》
java·开发语言·vue.js·spring boot·未成年人健康知识科普平台
Ivanqhz9 小时前
Ping-Pong 双缓冲
开发语言·人工智能·python·深度学习·mlir
m0_734571769 小时前
深入理解C++ RAII
开发语言·c++