告别重复造轮子,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();
相关推荐
方安乐3 小时前
python之向量、向量和、向量点积
开发语言·python·numpy
小小小米粒5 小时前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
czhc11400756635 小时前
C# 428 线程、异步
开发语言·c#
:1216 小时前
java基础
java·开发语言
SilentSamsara7 小时前
Python 环境搭建完整指南:从下载安装到运行第一个程序
开发语言·python
小短腿的代码世界7 小时前
Qt文件系统与IO深度解析:从QFile到异步文件操作
开发语言·qt
合天网安实验室7 小时前
记录一个免杀的php webshell demo
渗透测试·php·webshell·免杀
AnalogElectronic7 小时前
linux 测试网络和端口是否连通的命令详解
linux·网络·php
harder3218 小时前
RMP模式的创新突破
开发语言·学习·ios·swift·策略模式
jinanwuhuaguo8 小时前
OpenClaw工程解剖——RAG、向量织构与“记忆宫殿”的索引拓扑学(第十三篇)
android·开发语言·人工智能·kotlin·拓扑学·openclaw