在MFC中使用Qt(四):使用属性表(Property Sheet)实现自动化Qt编译流程

前言

首先回顾下前面文章介绍的:
在MFC中使用Qt(一):玩腻了MFC,试试在MFC中使用Qt!(手动配置编译Qt)

在MFC中使用Qt(二):实现Qt文件的自动编译流程

在MFC中使用Qt(三):通过编辑项目文件(.vcxproj)实现Qt的自动化编译流程

本文将详细介绍自动化Qt编译流程的最后一种方式:使用属性表(Property Sheet)实现自动化Qt编译流程。

使用属性表(Property Sheet)实现自动化Qt编译流程

首先需要了解下属性表的作用机制。

当你在项目中导入一个 .props 文件(属性表),其内容会被插入到项目文件的 ​全局作用域 中,并与项目原有配置 ​合并。

具体行为如下:
属性表中的这些节点会与项目文件中的同名节点合并。如果存在同名属性,项目文件中的配置可能优先(取决于 MSBuild 的评估顺序)。

因此本质上还是和方式二:编辑项目文件(.vcxproj)一样。

这里再新建一个基于对话框的MFC项目MFCWithQtAuto3,创建后编译运行:
1
接着参考手动编译流程中的步骤①②,在MFC项目配置Qt环境。

步骤①配置Qt环境(必不可少!)

2
3

步骤②配置项目

4
5
6
Qt环境配置完成后编译运行,确认没有问题:
7

属性表实现步骤③④的自动化Qt编译流程

再通过属性表实现步骤③④的自动化Qt编译流程,大致流程如下:

创建通用属性表,为所有 Qt 文件统一配置:
1)创建属性表。

右键项目 → ​Add → New Item → 选择 ​Property Sheet​(命名为 QtAuto.props)。
8

2)配置属性表。

在 QtAuto.props 中定义以下规则(内容和方式二中的配置一致):

<!-- 自动包含 所有目录下的 .ui 、moc、qrc文件 --><ItemGroup><UIFiles Include="**\*.ui" /></ItemGroup><!-- 自定义构建步骤,编译 .ui 文件为 .h 文件 --><ItemGroup><CustomBuild Include="@(UIFiles)"><Command>"uic.exe" %(FullPath) -o $(ProjectDir)GeneratedFiles\uic\ui_%(Filename).h</Command><Outputs>$(ProjectDir)GeneratedFiles\ui_%(Filename).h</Outputs></CustomBuild></ItemGroup><!-- 自动包含 所有目录下的 带Q_OBJECT宏的.h 文件。因无法区分普通的C++.h,因此需要在一个目录(这里是qt/UI目录)中统一管理 --><ItemGroup><MocFiles Include="$(ProjectDir)qt\UI\*.h" /></ItemGroup><ItemGroup><CustomBuild Include="@(MocFiles)"><Command>"moc.exe" "%(FullPath)" -o "$(ProjectDir)GeneratedFiles\moc\moc_%(Filename).cpp"</Command><Outputs>$(ProjectDir)GeneratedFiles\moc_%(Filename).cpp</Outputs></CustomBuild></ItemGroup><ItemGroup><!-- 自动包括所有的 .qrc 文件 --><QrcFiles Include="**\*.qrc" /></ItemGroup><ItemGroup><CustomBuild Include="@(QrcFiles)"><Command>"rcc.exe" "%(FullPath)" -o "$(ProjectDir)GeneratedFiles\rcc\qrc_%(Filename).cpp"</Command><Outputs>$(ProjectDir)GeneratedFiles\qrc_%(Filename).cpp</Outputs></CustomBuild></ItemGroup><ItemGroup><ClCompile Include="$(ProjectDir)GeneratedFiles\moc\moc_*.cpp"><PrecompiledHeader>NotUsing</PrecompiledHeader></ClCompile><ClCompile Include="$(ProjectDir)GeneratedFiles\rcc\qrc_*.cpp"><PrecompiledHeader>NotUsing</PrecompiledHeader></ClCompile></ItemGroup><ItemDefinitionGroup><ClCompile><!-- 添加新路径到现有包含目录列表 --><AdditionalIncludeDirectories>GeneratedFiles\uic;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories></ClCompile></ItemDefinitionGroup>

3)应用属性表。

进入属性管理器视图 -》 右键对应配置 -》 添加现有属性表 -》 选择刚刚创建的QtAuto.props:
9
同样使用MFC按钮点击弹出Qt对话框测试示例:
10
编译运行没有问题:
11

总结

方式三:使用属性表,本质上还是和方式二:编辑项目文件一样,只是没有直接编辑项目文件,而是通过创建一个同样的QtAuto.props,再导入到当前项目文件中。

通过这种方式可以实现Qt自动化编译流程属性配置的复用,在多人协同开发情况下,其中一人配置好通用的Qt自动化编译流程配置属性表,直接通过该属性表,可直接再另一个人的开发环境中导入配置使用,而无需再另外配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/74160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go红队开发— 收官工具

文章目录 免责声明个人武器开发美观输出Whois查询反查ip目录扫描子域名爆破被动扫描主动扫描(字典爆破)CDN检测 免责声明 &#x1f4a1; 本博客绝不涉及任何非法用途。 &#x1f4a1; 使用者风险自担&#xff0c;违规后果自负。 &#x1f4a1; 守法为先&#xff0c;技术向善。 …

论文阅读《P​roximal Curriculum for Reinforcement Learning Agents》——提升智能体学习速度的

老规矩&#xff0c;今天是使用Gemini2.5pro来生成的模板 这篇论文研究了如何为处理多个相关任务的强化学习智能体自动设计学习课程&#xff08;即任务顺序&#xff09;&#xff0c;以加速训练过程&#xff0c;并解决现有方法需要大量调参或缺乏理论依据的问题。为此&#xff0…

【面试题】在 CSS 中,实现一个 div 中的子 div 水平垂直居中

1. 使用 Flexbox 特点&#xff1a;简单、直观&#xff0c;现代浏览器支持良好。 代码&#xff1a; css .parent {display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */height: 200px; /* 父容器需有高度 */ } .child {…

基于SpringBoot的失物招领平台(源码+数据库)

476基于SpringBoot的失物招领平台&#xff0c;有用户和管理员两个角色&#xff0c;主要功能如下 失物招领系统功能介绍如下&#xff1a; 1. 用户功能&#xff1a; - 发布失物公告&#xff1a;用户可以发布自己的失物信息 - 失物分类&#xff1a;用户可以根据失物的类型进行分类…

PyQt6实例_批量下载pdf工具_批量pdf网址获取

目录 前置&#xff1a; 步骤&#xff1a; step one 安装包 step two 获取股票代码 step three 敲代码&#xff0c;实现 step four 网址转pdf网址 视频 前置&#xff1a; 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头&#xff0c;放在 【PyQt6实例】 专栏 2 本节讲…

量子退火与机器学习(2):少量实验即可找到新材料,黑盒优化➕量子退火

使用量子退火和因子分解机设计新材料 这篇文章是东京大学的一位博士生的毕业论文中的主要贡献。 结合了黑盒优化和量子退火&#xff0c;是融合的非常好的一篇文章&#xff0c;在此分享给大家。 https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.2.0133…

从零开始:Makefile 与 CMake 的基础入门与实践

本文适合基础学者 零基础 makefile 定义&#xff1a;Makefile 是一种传统的构建工具&#xff0c;用于定义如何编译和链接源代码。它通过一系列规则来描述如何生成目标文件&#xff08;如可执行文件或库&#xff09;。 功能&#xff1a;定义编译规则&#xff08;如如何从源文件…

android开启Sys V IPC,并使用共享内存编程

参考&#xff1a;安卓开启Sys V IPC&#xff0c;并使用共享内存编程 | 久奈浜的CS部 删除config中-# CONFIG_SYSVIPC is not set 在rk3576.config中增加CONFIG_SYSVIPCy CONFIG_SYSVIPCy CONFIG_SYSVIPC_SYSCTLy CONFIG_SYSVIPC_COMPATy CONFIG_IPC_NSy system/sepolicy/pre…

docker pull lss233/one-api:latest 在哪里运行,作用是什么

docker pull lss233/one-api:latest 在哪里运行,作用是什么 1. 在哪里运行? docker pull lss233/one-api:latest 是一个Docker命令,需在已安装Docker的环境中执行。 适用环境:本地开发机、服务器、云主机等。前提条件:需先安装Docker并配置好环境。2. 作用是什么? 该命令…

轮胎厂相关笔记

一、术语 图解&#xff1a;https://news.yiche.com/hao/wenzhang/38498703/ 1、胚胎 在轮胎制造行业中&#xff0c;“胎胚”&#xff08;也称“生胎”或“未硫化轮胎”&#xff09;是指轮胎在硫化&#xff08;高温高压固化&#xff09;之前的半成品形态。它是轮胎成型的中间…

开发者视角:应用程序中HTTP代理的集成指南

目录 一、为何需要HTTP代理&#xff1f; 二、集成方式分阶解析 三、关键配置管理策略 四、安全与性能平衡 五、调试与问题排查 六、最佳实践总结 结语 在开发需要与外部网络交互的应用程序时&#xff0c;HTTP代理是绕不开的实用工具。它既能解决网络限制问题&#xff0c…

从纸质到 AI 时代:我的笔记工具探索之旅

今天清晨&#xff0c;在得到上闲逛时&#xff0c;偶然间发现了一本名为《笔记的方法》的书&#xff0c;这本由Flomo的作者出版的图书&#xff0c;深入探讨了记笔记的艺术。 说起记笔记&#xff0c;这些年来&#xff0c;我尝试了各种各样的工具&#xff0c;今天就来梳理一下我的…

Ubuntu22云服务器添加2G Swap分区

Ubuntu22云服务器添加2G Swap分区 步骤 1&#xff1a;检查当前 Swap 和内存步骤 2&#xff1a;创建 2GB 的 Swap 文件步骤 3&#xff1a;设置权限并格式化步骤 4&#xff1a;启用 Swap 文件步骤 5&#xff1a;永久保留 Swap 配置可选优化&#xff1a;调整 Swappiness验证结果注…

网络空间安全(43)Linux实战篇

一、系统配置安全 BIOS安全设置 设置BIOS密码&#xff1a;防止未授权用户修改BIOS设置。修改引导次序&#xff1a;禁止从软盘启动系统&#xff0c;减少潜在的启动攻击风险。 文件系统权限管理 最小化SUID权限程序&#xff1a;SUID&#xff08;Set User ID&#xff09;程序以ro…

软件的常用设计模式。可参考一个一个学习

以下是软件设计中常见的 **23种经典设计模式**&#xff08;基于《设计模式&#xff1a;可复用面向对象软件的基础》GoF 的经典分类&#xff09;&#xff0c;并结合 **Python 语言特性**的简要说明和典型应用场景。我将它们分为 **创建型、结构型、行为型** 三大类&#xff0c;供…

性能比拼: Go(Gin) vs Python(Flask)

本内容是对知名性能评测博主 Anton Putra Go (Golang) vs Python Performance Benchmark (Kubernetes - OpenTelemetry - Prometheus - S3/Postgres) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中&#xff0c;我们将比较 Golang 和 Python 的性能。 但…

Android版本更新服务通知下载实现

在日常开发中&#xff0c;我们肯定会有检查版本更新的需求&#xff0c;那我版本更新的轮子网上也是有的&#xff0c;想自己实现一下代码如下&#xff1a; 下载管理类&#xff1a; public class DownLoadManager {private static final String MAIN "main"; //Tagp…

UE5学习笔记 FPS游戏制作33 换子弹 动画事件

新建动画蒙太奇 为Rifle和Launcher各自新建一个动画蒙太奇&#xff0c;拖入动画&#xff0c;注意动画的轨道要和动画蓝图里的一致 在蒙太奇添加动画事件 在通知一栏新增一个轨道&#xff0c;右键轨道&#xff0c;新增一个 换枪完成 通知&#xff0c;不同动画的同名通知需要…

uniapp中uploadFile的用法

基本语法 uni.uploadFile(OBJECT)OBJECT 是一个包含上传相关配置的对象&#xff0c;常见参数如下&#xff1a; 参数类型必填说明urlString是开发者服务器地址。filePathString是要上传文件资源的本地路径。nameString是文件对应的 key&#xff0c;开发者在服务端可以通过这个 …

Android设计模式之责任链模式

一、定义&#xff1a; 使多个对象都有机会处理请求&#xff0c;从而避免了请求的发送者和接收者之间的耦合关系将这些对象连城一条链&#xff0c;并沿着这条链传递该请求&#xff0c;只到有对象处理它为止。 二、模式结构&#xff1a; 抽象处理者&#xff08;Handler&#xff…