QT+VS 在项目中新建子窗体ui,生成h文件、cpp文件、moc文件

2023-10-31

(1)绘制子窗体
在项目中新建子窗体ui文件,命名为testUi.ui。
在这里插入图片描述

(2)新建上述窗体文件对应的ui类
建议将ui类与子窗体设置成相同的名字(testUi.h、testUi.cpp),此时testUi还是一个只包含默认构造函数和析构函数的空类。
在这里插入图片描述

(3)生成moc_testUi.cpp文件
moc文件作用:Qt程序在交给标准编译器预编译之前要使用 moc 分析 C++ 源文件。
1)去项目文件夹下找到该项目的工程文件(文件类型为:VC++ Project,一般与解决方案文件*.sln放在一起),打开(建议使用Notepad++或者VSCode打开)。
在这里插入图片描述
2)在上述工程文件中添加相应代码,并重新编译,即可生成对应的moc_testUi文件。
在项目中随机查找一个可以正常运行的ui类作为参照类,我找的是VsursPoleWidget类。工程文件中凡是出现VsursPoleWidget类的代码块都复制粘贴一份,然后把类名替换成你自己新建的子窗体类名testUi。
使用Notepad++的字符串查找功能在工程文件的4处地方发现了VsursPoleWidget类的代码块:

VsursPoleWidget.ui文件

    <CustomBuild Include="ui\VsursPoleWidget.ui">
      <FileType>Document</FileType>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OSGEO4W_ROOT)\apps\Qt5\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Uic%27ing %(Identity)...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(OSGEO4W_ROOT)\apps\Qt5\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OSGEO4W_ROOT)\apps\Qt5\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Uic%27ing %(Identity)...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(OSGEO4W_ROOT)\apps\Qt5\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>
      <SubType>Designer</SubType>
    </CustomBuild>

VsursPoleWidget.h文件

    <CustomBuild Include="bussiness\VsursPoleWidget.h">
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OSGEO4W_ROOT)\apps\Qt5\bin\moc.exe;%(FullPath)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing %(Filename).h...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(OSGEO4W_ROOT)\apps\Qt5\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB   "-I." "-I$(OSGEO4W_ROOT)\apps\Qt5\include" "-I$(OSGEO4W_ROOT)\apps\Qt5\include\QtCore" "-I$(OSGEO4W_ROOT)\apps\Qt5\include\QtGui"</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OSGEO4W_ROOT)\apps\Qt5\bin\moc.exe;%(FullPath)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing %(Filename).h...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(OSGEO4W_ROOT)\apps\Qt5\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I$(OSGEO4W_ROOT)\apps\Qt5\include" "-I$(OSGEO4W_ROOT)\apps\Qt5\include\QtCore" "-I$(OSGEO4W_ROOT)\apps\Qt5\include\QtGui"</Command>
    </CustomBuild>

VsursPoleWidget.cpp文件

<ClCompile Include="bussiness\VsursPoleWidget.cpp" />

moc_VsursPoleWidget.cpp文件

    <ClCompile Include="GeneratedFiles\Release\moc_VsursPoleWidget.cpp">
      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
    </ClCompile>

分别把上述4个代码块复制粘贴,然后把粘贴后代码块中的"VsursPoleWidget"替换成"testUi"。但此处需要注意文件路径的问题,VsursPoleWidget.ui文件位于项目文件加的ui子文件夹下,VsursPoleWidget.h文件位于business子文件夹下,VsursPoleWidget.cpp文件也位于business子文件夹下。若testUi位于其他子文件夹下,则需要修改对应的子文件夹名称,结果如下:

testUi.ui文件

    <CustomBuild Include="ui\testUi.ui">
      <FileType>Document</FileType>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OSGEO4W_ROOT)\apps\Qt5\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Uic%27ing %(Identity)...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(OSGEO4W_ROOT)\apps\Qt5\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OSGEO4W_ROOT)\apps\Qt5\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Uic%27ing %(Identity)...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(OSGEO4W_ROOT)\apps\Qt5\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>
      <SubType>Designer</SubType>
    </CustomBuild>

testUi.h文件

    <CustomBuild Include="bussiness\testUi.h">
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OSGEO4W_ROOT)\apps\Qt5\bin\moc.exe;%(FullPath)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing %(Filename).h...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(OSGEO4W_ROOT)\apps\Qt5\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB   "-I." "-I$(OSGEO4W_ROOT)\apps\Qt5\include" "-I$(OSGEO4W_ROOT)\apps\Qt5\include\QtCore" "-I$(OSGEO4W_ROOT)\apps\Qt5\include\QtGui"</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OSGEO4W_ROOT)\apps\Qt5\bin\moc.exe;%(FullPath)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing %(Filename).h...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(OSGEO4W_ROOT)\apps\Qt5\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I$(OSGEO4W_ROOT)\apps\Qt5\include" "-I$(OSGEO4W_ROOT)\apps\Qt5\include\QtCore" "-I$(OSGEO4W_ROOT)\apps\Qt5\include\QtGui"</Command>
    </CustomBuild>

testUi.cpp文件

<ClCompile Include="bussiness\testUi.cpp" />

moc_testUi.cpp文件

    <ClCompile Include="GeneratedFiles\Release\moc_testUi.cpp">
      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
    </ClCompile>

修改完毕后保存工程文件,再次打开VS时会有如下提示:
在这里插入图片描述
点击全部重新加载,再次编译,若重新生成过程发生错误,请回到项目文件夹下检查testUi.ui、testUi.h、testUi.cpp这三个文件的路径是否与VC++ Project工程文件下的路径一致。
重新生成后的testUi.ui、testUi.h、testUi.cpp文件在解决方案资源管理器中的位置会发生改变,不过问题不大,只要手动拖回原来的位置即可。
编译结束后会生成moc_testUi.cpp文件,但这还是个空文件,里面并没有代码。

3)修改testUi类

#ifndef TESTUI_H
#define TESTUI_H

#include "ui_testUi.h"   //必须添加 "ui_类名.h" 头文件

class testUi:public QDialog,public Ui::Dialog
{
	Q_OBJECT  //添加 Q_OBJECT宏,为ui类提供信号槽机制
public:
	testUi()
	{
		setupUi(this); //ui类的构造函数中必须包含启动函数,可将代码与界面关联起来。
	}
	~testUi(){}
};
#endif;

testUi类修改完毕后再次编译,此时编译器会在moc_testUi.cpp中自动填充代码
在这里插入图片描述

4)连接信号槽
定义槽函数:

void MainWindow::doActionTest()
{
	testUi* p = new testUi();
	p->show();
}

connect函数连接信号槽

connect(mui->action_TestUi, SIGNAL(triggered()), this, SLOT(doActionTest()));

最终实现主界面上点击一个按钮,弹出下列子窗体对话框。
在这里插入图片描述

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

QT+VS 在项目中新建子窗体ui,生成h文件、cpp文件、moc文件 的相关文章

随机推荐

  • 给电子信息工程大学生的一些忠告

    漫漫长路 首先恭喜各位能够进入电子行业 只是这个行业感觉还是有前途的 不过在好的条件还要看自己努力不 好的开端是成功的一半 如果各位真的是想毕业以后做与自己行业有关的工作 那就听我慢慢的到来 如果是毕业不想做与自己专业有关的工作 那我下面要
  • 美国科学家提出AGI概念,将在未来取代AI人工智能!

    人工智能学科的核心是有一天我们能够建造一个像人类一样聪明的机器 这种系统通常被称为人工通用智能系统 即AGI 它是将概念与更广泛的研究领域区分开来的名称 它还清楚地表明 真正的人工智能拥有广泛且适应性强的智能 到目前为止 我们已经建立了无数
  • class类python_python入门(七)class类

    类 是面向对象一个载体 类的定义 class A object pass 全局变量 函数1 def self 函数2 def 类里面有很多函数 函数第一个参数默认都是self 变量可以直接在类的内部直接定义 类在内部调用函数或者变量的时候
  • 我工作中踩过的坑--服务器管理篇

    也许有人会问 束测搞好束测的事就好了 干嘛还自己搞服务器后台啥的 貌似以前有个文解释了的 竟然一时找不到 就再啰嗦一下 束测有众多子系统 各种采集 摄像头 示波器 万用表 电机控制 各种专用处理器 以前一般都是众多的工控机直接去连设备跑起程
  • 用R制作gif动态图以及从gif中提取图片

    作者 辉小宝同学 微信公众号 R语言和Python学堂 知乎 https www zhihu com people zoro 3 92 posts 简书 https www jianshu com u 981ba7d6b4a6 熟悉R的朋友
  • Android 短时间内多次启动同一个Service会不会有多次的binder调用

    背景 笔者刚接触公司的新项目 发现项目中有些场景居然在短时间内 几十毫秒内 发送同一个Service 本来功能没有什么大问题 但是笔者有点怀疑 短时间内发送多个相同的Service会不会影响性能 因为启动服务涉及到binder通信 ANR问
  • 语义分割图像增强新方法

    最近在日常挖坑中发现了另一种简单有效数据扩充方法 将其分享使用 之前都是利用opencv自己编写代码进行图像的翻转 旋转角度 裁剪 亮度变化等等操作 对于语义分割任务来说 一种有效的提升性能的办法就是对现有数据进行增强 扩充现有数据的多样性
  • 查询postgresql死锁数量

    每个数据库的死锁数量都存在postgresql自身维护的 pg stat database 表中 查询postgres死锁数量 select deadlocks from pg stat database
  • webpack5打包vue项目

    目录 写在前面 webpack四大核心 entry 入口 loader 加载器 plugin 插件 output 出口 webpack打包vue项目 初始化项目 vue loader webpack dev server 配置开发服务器 加
  • 微信小程序开发【知识点大全】

    微信小程序开发重点 知识点 token appid openid AppSecret 快捷键 知识点 token 有些接口是可以公开访问的 有些是不允许公开访问的 所以要设置token进行区分验证 token机制 客户端获取一个code 通
  • 创建私有仓库时,重启docker服务报错

    报错信息 Unit docker service has begun starting up 3月 23 22 53 52 docker dockerd 82851 unable to configure the Docker daemon
  • 微信小程序-防止多次点击跳转的问题(实战项目亲测有效)

    微信小程序 防止多次点击跳转的问题 最近多个小程序项目遇到一个头大的问题 就是点击事件多次点击会造成多次重复跳转或多次请求的情况 网上看了一下论坛一大堆方法 试了几个都是不行 最后看了一下小程序的文档 发现遗忘了很实用了触控事件bindto
  • 想在网上兼职做什么比较好,分享五个网上兼的副业项目帮你拓展视野

    许多工薪族都想要运用下班了的空余时间根据网上做兼职 却却找不到人正确引导一条正确的方向 并没有渠道信息内容 那他们如何找到自已的做兼职呢 小编觉得应当在网络上多查看的相关资料 多探寻方式 选择适合自己的做兼职 随后用心去感受干 慢慢地 便会
  • 前缀和求解k倍区间问题

    题目描述 给定一个长度为 N的数列 A1 A2 AN 如果其中一段连续的子序列Ai Ai 1 Aj之和是 K 的倍数 我们就称这个区间 i j 是 K倍区间 你能求出数列中总共有多少个 K倍区间吗 输入格式 第一行包含两个整数 N和 K 以
  • 完全详解权限系统设计方案

    1 为什么需要权限管理 日常工作中权限的问题时时刻刻伴随着我们 程序员新入职一家公司需要找人开通各种权限 比如网络连接的权限 编码下载提交的权限 监控平台登录的权限 运营平台查数据的权限等等 在很多时候我们会觉得这么多繁杂的申请给工作带来不
  • IT项目管理个人作业7(操作案例)

    完成作业1 3的要求 使用 project 或其他工具 作业1 假设项目管理 需求定义的工作都由项目经理做 其他工作则由其他项目成员做 WBS条目 小时数 单位小时成本 美元 子层总和 美元 WBS第二层的总和 美元 占总和的 1 项目管理
  • grid网格布局实现图表框架(vue)

    需求 需要实现一个如图所示的界面 实现 用grid布局来实现 div class inner div div div
  • 岁月划过生命线(从阿里到微店)

    从阿里到微店 标签 程序人生 在 lt 2 5年 从0到阿里 gt 中提到过 当时面阿里云OS时预期的是进入虚拟机团队 结果后来被分到了高通平台参考设计团队 因此在阿里期间心情一直是比较低落的 写这篇博客主要是基于以下几个原因 前段时间跟大
  • 利用Matlab进行图像分割和边缘检测

    本文章包含以下内容 1 灰度阀值分割 1 单阈值分割图像 先将一幅彩色图像转换为灰度图像 显示其直方图 参考直方图中灰度的分布 尝试确定阈值 应反复调节阈值的大小 直至二值化的效果最为满意为止 给图像加上零均值的高斯噪声重复上述过程 注意阈
  • QT+VS 在项目中新建子窗体ui,生成h文件、cpp文件、moc文件

    1 绘制子窗体 在项目中新建子窗体ui文件 命名为testUi ui 2 新建上述窗体文件对应的ui类 建议将ui类与子窗体设置成相同的名字 testUi h testUi cpp 此时testUi还是一个只包含默认构造函数和析构函数的空类