Qt/C++项目架构经验总结

2023-11-18

(一)通用规则

  1. 除了极小的微型demo级别项目外,其余项目建议用pri分门别类不同文件夹存放代码文件,方便统一管理和查找。
  2. 同类型功能的类建议统一放在一起,如果该目录下代码文件数量过多,也建议拆分多个目录存放。
  3. 比如就3-5个界面的项目,统一搞个form.pri存放这些界面,而当项目越来越大,界面可能也需要按照功能划分,比如系统配置的窗体放在一个目录下,日志管理的窗体放在一个目录下。
  4. 很多通用功能,多个项目都会用到,可以考虑封装成pri形式的模块,俗称轮子,不断完善这些轮子,多个项目共享该模块,一旦遇到BUG修复,只需要更改一个地方就行。
  5. 项目如果还更大或者项目组人员分配不同功能,可以考虑插件形式,插件一般会用到两种,一种是普通动态库形式的插件,必须和主程序放在一起;一种是Qt机制的插件,放在指定的目录。

(二)全局配置文件

全局配置文件管理类 appconfig.h 用来读写对应项目的配置文件。

  1. 格式可以是ini、xml、json等,小项目建议ini,怎么方便怎么来,相当于将配置文件的值映射到全局变量。
  2. 配置文件如果配置项较多建议分组存储方便查找,而不是全部放在一个大分组中。
  3. 读配置文件的时候可以判断配置文件是否存在、配置项是否缺失等情况,有问题则重新生成配置文件,避免恶意删除配置文件导致程序运行异常。
  4. 读配置文件的时候可以填入默认值(qt配置文件类QSettings的value方法的第二个参数,set.value(“Hardware”, App::Hardware)),避免初始时候读取不到节点而导致配置项值不符合预期值类型。
  5. 读配置文件完成后可以重新判断配置项的值是否符合要求,对值进行过滤和矫正,防止人为打开配置文件修改后填入了异常的值,比如定时器的间隔为0,要重新纠正设定为合法的值。
  6. 带中文的初始值用QString::fromUtf8包起来,比如QString::fromUtf8(“管理员”)。
  7. 带中文的配置项要设置配置文件编码为 utf-8,set.setIniCodec(“utf-8”)。

(三)全局变量

全局变量管理类 appdata.h 用来设置项目中用到的所有全局变量。

  1. 比如当前用户/系统是否锁定等,这样可以在任意的编码位置使用该变量进行判断处理。
  2. 可以将UI界面中的导航栏宽高、按钮大小、图标大小等变量放在这,系统启动后判断分辨率等来设定不同的值。

(四)全局事件中转处理

全局事件中转处理类 appevent.h 用来中转系统中各种跨多个UI以及多个类的事件。

  1. 此类必须是全局单例类,便于全局统一使用。
  2. 比如类a的父类是b,类b的父类是c,现在有个信号要发给类d,在没有事件中转处理的情况下的做法是将a信号发给b,b再发给c,c再发给d,如果父类嵌套层级越多越复杂,代码越难管理。
  3. 将类a的信号发给appevent类,然后类d直接关联appevent类进行处理就行。
  4. 项目越大,会越发现事件中转处理的必要性,代码清晰,管理方便。

(五)全局程序初始化

全局程序初始化类 appinit.h 用来做一些程序启动后的初始化处理。

  1. 读取配置文件。
  2. 设置全局字体。
  3. 设置全局样式表,建议先读取通用的样式表,然后将额外的样式表内容加到后面一起设置。
  4. 设置项目编码。
  5. 设置翻译文件,可以加载多个,包括qt内置的qt_zh_CN.qm,用户自己的翻译文件等。
  6. 初始化随机数种子。
  7. 新建项目中需要的目录,防止没有目录无法保存文件到目录。
  8. 初始化数据库,包括打开数据库,载入基础数据比如用户表、设备表等。
  9. 启动日志输出类用来启动日志服务。
  10. 启动运行时间记录类用来记录每次软件运行开始时间和结束时间。
  11. 关联全局事件过滤器处理自定义无边框UI拖动、全局按键处理等。

(六)全局通用类

  1. 调试日志输出类 savelog.h 用来启动日志服务,可以将日志输出到文件或者网络打印输出。
  2. 运行时间记录类 saveruntime.h 用来记录每次软件运行开始时间和结束时间。
  3. 图形字体类 iconfont.h 用来设置图形字体图标。

未完待续持续更新

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt/C++项目架构经验总结 的相关文章

  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu

随机推荐

  • v-if与v-show的区别=====》面试题

    共同点 都是控制元素显示或隐藏的指令 区别 v show 控制元素无论是true还是false都会被渲染出来 通过diaplay none控制元素隐藏 v if控制元素是true渲染 是false不渲染 在dom树结构中不显示 加分回答 应
  • [STM32系列]一、HAL库的串口中断接收

    STM32系列 一 HAL库的串口中断任意长度接收 1 前言 2 回调函数 3 HAL库中断接收函数使用 1 前言 HAL即硬件抽象层 英语 Hardware Abstraction Layer 实现了不同硬件的统一接口操作 这就极大的简化
  • 极简Json格式剖析与fastjson下载和使用

    Json存在的意义 Json主要用来做数据的传输 例如发送java中的一个对象 由于对象是存储在内存里的 不能直接将内存里的对象发送出去 这时需要使用序列化 持久化 手段 将对象转换为一系列字符串 比如说Json 在字符串送达目的地时再使用
  • HTTP协议和Tomcat服务器

    目录 1 HTTP 是什么 2 HTTP 工作过程 2 1 HTTP 协议格式 2 1 1 抓包工具的使用 2 1 2 抓包工具原理 2 1 3 抓包结果分析 2 1 4 协议格式总结 3 HTTP 请求 Request 3 1 请求地址
  • 常用的数组方法整理

    常用的数组方法 1 concat 2 join 3 pop 4 shift 5 unshift 7 reverse 8 sort 9 slice 10 splice 11 toString 12 valueOf 13 IndexOf 14
  • 二、Vue3跨组件调用函数[mitt]

    一 跨组件调用函数 安装 npm install mitt 创建文件并写入 bus js import mitt from mitt export const eventBus mitt 使用方法 import eventBus from
  • 2022年6月8日STM32——SPI读写串行FLASH 和 串行FLASH文件系统FatFs

    此内容是为自己方便回忆 如有错误 欢迎指导 内容来源于野火指南者开发板教程 一 SPI读写串行FLASH SPI Serial Peripheral Interface 串行外围设备接口 是高速全双工的通信总线 通讯速率较高 SPI物理层
  • VS2019中文输出乱码解决方法(C语言)

    现象 VS2019控制台输出中文乱码 第一种解决方法 安装插件Format on Save重启VS2019生效 注意 别装错了 刚开始我就装错了这个UTF 8 No BOM 装了这个插件的同学 记得要删掉 不然还是会出现问题 第二种解决方法
  • 等价类

    动态测试方法是指通过运行被测程序 检查运行结果与预期结果的差异 并分析运行效率 正确性和健壮性等性能 这种方法由三部分组成 构造测试用例 执行程序 分析程序的输出结果 静态方法是指不运行被测程序本身 仅通过分析或检查源程序的语法 结构 过程
  • 无线通信原理之OFDM技术

    补充一个完整的OFDM系统结构图 包括收发天线 目录 1 OFDM的基本原理 2 OFDM系统模型 3 循环前缀和导频 4 OFDM系统参数 1 OFDM的基本原理 OFDM即正交频分复用 Orthogonal Frequency Divi
  • React-错误边界与组件通信方式概述

    错误边界 错误边界 Error boundary 用来捕获后代组件错误 渲染出备用页面 注意 只在生产环境 项目上线 起效 特点 只能捕获后代组件生命周期产生的错误 不能捕获自己组件产生的错误和其他组件在合成事件 定时器中产生的错误 简单理
  • DevOps是什么

    DevOps 英文Development和Operations的组合 是一组过程 方法与系统的统称 用于促进开发 应用程序 软件工程 技术运营和质量保障 QA 部门之间的沟通 协作与整合 它的出现是由于软件行业日益清晰地认识到 为了按时交付
  • JavaBean SpringBean是对象还是类

    JavaBean SpringBean是对象还是类 什么是JavaBean 什么是SpringBean 首先先说结论 Bean可以理解为对象 这几天在学习Spring源码的时候 观察到底层反复的对Bean的操作 于是就去网上搜索Bean到底
  • JAVA小程序微信支付

    微信支付有专门的文档 https pay weixin qq com wiki doc api wxa wxa api php chapter 9 1 当时找的时候都是前台如何 后来才发现后台需要做的就是统一下单 一 先到微信下载两个证书
  • java实现冒泡排序,直接插入排序,选择排序,希尔排序,以及求出它们的时间复杂度O(n)

    package com yg sort author GeQiLin date 2020 2 25 16 53 import java util Arrays public class Sort1 private static int ma
  • ModuleNotFoundError: No module named 'tqdm'

    bogon faceswap master macname pip3 install tqdm Collecting tqdm Downloading https files pythonhosted org packages 9f 3d
  • 软件版本(release、stable、lastest)的区别

    snapshot 快照 也即开发版 我们创建maven项目时 编辑器会自动给我们填入 1 0 SNAPSHOT版本 也就是1 0开发版 这个版本不能使用 因为该版本处于开发的过程 所以运行时会不时地更新 导致功能变化 正式环境中不得使用sn
  • layer.js open 隐藏滚动条

    img echart trand click function var host this data host var role this data role console log host host console log window
  • 华为防火墙NAT

    目录 NAT分类 黑洞路由 Server map 表 NAT分类 在内外网的边界 流量有出 入两个方向 所以NAT技术包含源地址转换和目的地址转换 一般情况下 源地址转换主要解决内部局域网计算机访问internet的场景 而目标地址转换主要
  • Qt/C++项目架构经验总结

    一 通用规则 除了极小的微型demo级别项目外 其余项目建议用pri分门别类不同文件夹存放代码文件 方便统一管理和查找 同类型功能的类建议统一放在一起 如果该目录下代码文件数量过多 也建议拆分多个目录存放 比如就3 5个界面的项目 统一搞个