QT快速开发框架

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

"不管多小的 Qt 项目,总有一堆琐碎但必要的事情要做。"

作为一个 Qt 开发者,你是否经历过:

  • 每次新建项目都要重写一遍日志系统?
  • 程序崩溃后用户说"不知道发生了什么",而你根本拿不到堆栈?
  • 配置文件散落在各处,版本升级后配置丢失?
  • HTTP 请求封装写了无数次,每次都要重新解析 JSON?
  • 简单的数据 CRUD 操作,却要重写大量样板代码?

这些问题和具体业务无关,却每个项目都要面对。这就是我做 QtMachineDog 的原因——把通用的事一次做好,让开发者专注于业务逻辑

开源地址:https://gitee.com/Tlink/machine


简单介绍

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)));

ScreenShot_2026-02-06_093231_592

3. CRUD 模板:业务开发的复制粘贴神器(本程序使用的数据库为sqlite)

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

  • 数据模型定义
  • 数据库操作接口
  • 视图绑定逻辑
  • 基础的增删改查 UI

数据增删查改

数据增删查改2

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();
}

4. SelfHost Web服务-可内嵌 HTTP 服务 | 内置轻量级 Web Server,可用于本地 API 或监控面板

selfhost_web

💬 写在最后

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++ #跨平台开发

posted @ 2026-02-06 09:49  Tlink  阅读(148)  评论(0)    收藏  举报