告别重复造轮子,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();
相关推荐
名字还没想好☜10 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
一壶浊酒..13 小时前
Scrape Webpack练习
开发语言·javascript·webpack
命运之光14 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
命运之光14 小时前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
猿长大人14 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log
在世修行16 小时前
从零打造 C# 工业视觉检测系统(七):串口通信 SerialPort 封装与开发
开发语言·c#·modbus rtu·rs232/rs485
Hammer_Hans16 小时前
DFT笔记98
java·开发语言·数据库
2601_9657984717 小时前
Is Piroll WordPress Theme Worth It for Freelancers? Full Review
数据库·php
≮傷£≯√17 小时前
Opencv VideoCapture
qt·opencv
qq_4480111617 小时前
C语言中的野指针和空指针
c语言·开发语言·单片机