qrc 不是万能仓库,Qt 项目包越打越大就是这么来的
有些坑不是程序崩了才叫坑项目越来越难改也是一种坑。我以前接过一个 Qt 桌面客户端刚开始大家都觉得 qrc 很好用。图标放进去样式表放进去翻译文件放进去后来连默认配置、报表模板、设备协议说明、升级脚本都往里塞。结果项目跑了两年安装包越来越大现场想改一个模板文案居然要重新编译、重新打包、重新发版。客户一句“就改两个字”我们这边一套流水线全跑一遍。qrc 本身没问题问题是很多人把它当成了万能仓库。qrc 解决的是“随程序发布”的问题Qt 资源文件最大的好处是把资源编进程序里。比如图标、内置图片、默认 QSS、小型占位文件这些资源和程序版本强绑定放 qrc 里非常合适。ui-btnStart-setIcon(QIcon(:/icons/start.svg));这类资源放 qrc 里很舒服。不会因为路径错、安装目录变了、用户误删文件导致界面缺图标。尤其是工业上位机、桌面客户端这种环境现场机器权限乱、目录乱qrc 能省掉不少低级问题。但它的代价也很明显资源一旦编进二进制就跟程序绑死了。你要改资源就要重新构建程序。图标可以配置不一定可以启动页可以报表模板就要慎重。资源也要分“内置”和“可变”我现在做 Qt 项目一般会把资源分成两类。一类是内置资源比如基础图标、默认翻译、内置空状态图片、兜底 QSS。这些属于程序能力的一部分适合进 qrc。另一类是可变资源比如客户现场配置、设备参数、报表 HTML 模板、导出 Excel 模板、插件描述文件。这些我更倾向放在程序目录、用户数据目录或者数据库里。QString pathqApp-applicationDirPath()/templates/report.html;QFilefile(path);这段代码不高级但项目里很实用。报表模板放外部目录现场要改格式不用重新发程序。尤其是 TCP 采集、串口设备、数据库报表这些项目客户经常临时调整字段名、单位、页眉页脚模板外置能少挨很多骂。别把配置文件塞进 qrc 里自我感动最常见的误区是把默认配置和运行配置混在一起。默认配置可以进 qrc作为兜底但真正运行时的配置最好复制到外部文件再让程序读写外部版本。否则你会遇到一个很尴尬的问题程序里明明有配置文件但用户改不了运维也改不了最后只能找开发重新打包。qrc 适合放“不希望用户改”的东西不适合放“迟早会被要求改”的东西。翻译文件也是类似。产品早期可以把 qm 放进 qrc省事。但如果项目有多客户、多现场、多语言热更新需求翻译外置会更灵活。否则一个词条改动也会拖着主程序一起发版。常见坑或经验提醒第一个坑是资源过大。有人把高清图片、视频、帮助文档全塞进 qrc最后 exe 或动态库巨大。加载、分发、增量升级都会受影响。第二个坑是路径管理混乱。qrc 里一堆:/new/prefix1时间久了没人知道谁还在用。资源删不敢删改不敢改项目像长了苔藓。第三个坑是把 qrc 当安全手段。资源编进去不代表绝对安全真要保护授权、密钥、协议参数别指望 qrc。qrc 是资源打包机制不是加密方案。第四个坑是插件架构里乱用 qrc。主程序、插件各自带资源时要注意资源初始化和命名冲突。插件图标、QSS、翻译如果全靠主程序统一管理后期拆插件会很痛苦。最后说两句我对 qrc 的判断很简单稳定、小型、强版本绑定的资源放 qrc频繁变化、客户相关、现场可调的资源放外部。qrc 是 Qt 项目里很好用的工具但它不是仓库管理员。前期为了省一个路径判断把所有东西塞进去后期升级、维护、交付都会找你算账。真正成熟的 Qt 项目资源管理一定是有边界的。边界清楚程序包才不会越滚越胖现场改动也不用每次都惊动开发。