【Qt学习笔记】(二)--第一个程序“Hello World”(学习Qt中程序的运行、发布、编译过程)

   声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。
   因为我个人对Qt也是有一些需求,所以开设本专栏进行学习,希望大家可以一起学习,共同进步。
  这篇博客将从一个 Hello World 程序讲起,先讲述一个Qt Widgets 项目的创建、运行 和发布的过程;然后再将整个项目分解,从单一的主函数文件,到使用图形界面.ui文 件,再到自定义C++类和Qt图形界面类,一步一步分析解释每行代码,并从命令行编译运行,让小伙伴们清楚地看到 Qt Creator 创建、管理、编译和运行项目的内部实现。写完这篇博客,希望和小伙伴们一起掌握Qt项目建立、编译、运行和发布的整个过程

一、 编写Hello World程序

加重
加重
加重
加重
突出
突出

1.1 新建Qt Widgets应用

  第一步,选择项目模板。选择“文件→新建文件或项目”菜单项(也可以直接按下Ctrl+N快捷键,或者单击欢迎模式中的New Project按钮),在选择模板页面选择 Application 中的 Qt Widgets Application 项,然后单击 “选择”按钮,如下图所示。
在这里插入图片描述
  第二步,输入项目信息。在“项目介绍和位置”页面输入项目的名称为 helloworld,然 后单击创建路径右边的“浏览”按钮来选择源码路径。 如果选中了这里的“设置默认的项目路径”,那么以后创建的项目会默认使用该目录,如下图所示。单击“下一步”进入下个页面。注意:项目名和路径中都不能出现中文
在这里插入图片描述
  第三步,选择构建系统。在Qt6之后出现该选项,其实我也没太搞懂qmake和Cmake的区别,所以我去询问了一下大佬(chatGPT),解答如下:
在这里插入图片描述

Qt中的qmakeCMake都是用于构建项目的工具,但它们有一些区别。

  1. 语法和语言:

    • qmake 使用一种自己的领域特定语言(DSL),这种语言的语法比较简单,通常用于描述项目文件和构建规则。这种语言的学习曲线相对较低,但在复杂项目中可能会显得不够灵活。
    • CMake 使用一种更加通用的脚本语言,即CMakeLists.txt文件。CMake的语法可能会更加灵活,并且可以更容易地编写复杂的构建规则。
  2. 跨平台性:

    • qmake 是Qt的官方构建系统,因此与Qt集成更加紧密,对于构建Qt项目来说更加直接。但在跨平台支持方面可能相对较弱,尤其是当涉及到非Qt库的时候。
    • CMake 是一种更加通用的构建系统,它可以用于构建任何类型的项目,并且具有更好的跨平台性,能够更轻松地在不同的操作系统和编译器上工作。
  3. 社区和生态系统:

    • CMake 有着更加广泛和活跃的社区支持,因此可以更容易地找到解决方案、教程和插件等资源。
    • qmake 虽然作为Qt的官方构建系统,但相比之下,其社区支持可能相对较小。
  4. 灵活性:

    • CMake 的模块化和灵活性使得它能够更好地处理复杂的项目结构和依赖关系。
    • qmake 在处理复杂项目时可能会显得笨拙,并且很难实现一些高级功能。

  总的来说,qmake 更适合于纯粹的Qt项目,特别是那些简单的、跨平台要求不高的项目。而对于更大型、更复杂的项目,以及跨平台支持要求较高的项目,CMake 通常更受欢迎。
  说实话,我还是没看懂,不过感觉选择qMake比较好。
  第四步,细节选择。这里我们选择QWidget,选中"Generate form",选择这个选项之后就可以通过ui文件来搭建界面。
在这里插入图片描述
  第五步,选择构建套件。这里显示的 Desktop Qt 6.4.3 MinGW 64bit 就是在上一篇博客看到的构建套件。
在这里插入图片描述

1.2 文件说明与界面设计

  项目建立完成后会直接进入编辑模式。界面的右边是编辑器,可以阅读和编辑代 码。如果觉得字体太小,则可以使用快捷键Ctrl+“+”(即同时按下Ctrl键和十号键) 来放大字体,使用Ctrl+“-”(减号)来缩小字体,或者使用Ctrl键+鼠标滚轮,使用 Ctrl + 0(数字)可以使字体还原到默认大小。再来看左边侧边栏,其中罗列了项目中 的所有文件,如下图所示。
在这里插入图片描述
  现在在helloworld文件夹,其中包括了6个文件,各个文件的说明如下表所列。这些文件的具体内容和用途会在后面的内容中详细讲解。
在这里插入图片描述
  在Qt Creator 的编辑模式下双击项目文件列表中界面文件分类下的 widget.ui文件,这时便进入了设计模式,如下图所示。可以看到,设计模式由以下几部分构成:
在这里插入图片描述

1.2.1 主设计区

  主设计区是上图中的中间部分,主要用来设计界面以及编辑各个部件的属性。

1.2.2 部件列表窗口(Widget Box)

  窗口分类罗列了各种常用的标准部件,可以使用鼠标将这些部件拖入主设计区中, 放到主设计区中的界面上。

1.2.3 对象查看器(Object Inspector)

  查看器列出了界面上所有部件的对象名称和父类,而且以树形结构显示了各个部 件的所属关系。可以在这里单击对象来选中该部件。

1.2.4 属性编辑器(Property Editor)

  编辑器显示了各个部件的常用属性信息,可以更改部件的一些属性,如大小、位置 等。这些属性按照从祖先继承的属性,从父类继承的属性和自己属性的顺序进行了 分类。

1.2.5 动作(Action)编辑器与信号和槽编辑器

  两个编辑器可以对相应的对象内容进行编辑。因为现在还没有涉及这些内容,所 以放到以后使用时再介绍。

1.2.6 常用功能图标

  单击最上面侧边栏中的前4个图标(如下图)可以进入相应的模式,分别是窗口部件编辑模式(这是默认模式)、信号/槽编辑模式、伙伴编辑模式和 Tab 顺序编辑模式。后面的几个图标用来实现添加布局管理器以及调整大小等功能。
  下面从部件列表中找到Label(标签)部件,然后按住鼠标左键将它拖到主设计区的界面上,再双击它进入编辑状态后输入“Hello World! 你好 Qt!”字符串。Qt Creator 的设计模式中有几个过滤器,就写着“Filter”的行输入框。例如,在部件列表窗口过 滤器中输入“Label”就快速定位到 Label部件,不用自己再去查找。其他几个过滤器作用也是这样。在这里插入图片描述

二、 程序的运行与发布

2.1 程序的运行

2.1.1 编译程序运行

  可以使用快捷键Ctrl+R或者通过按左下角的运行按钮来运行程序。如果是第一次使用,则会弹出“保存修改”对话框,这是因为刚才在设计模式更改了界面,而widget.ui 文件被修改了但是还没有保存。现在要编译运行该程序,就要先保存所有文件

2.1.2 查看构建项目生成的文件

  Qt Creator 将项目源文件和编译生成的文件进行了分类存放,helloworld文件夹中是项目源文件,这个文件夹存放的是编译后生成的文件。进入该文件夹可以看到如下图所示。
在这里插入图片描述

2.1.3 直接运行生成的可执行文件

  双击运行 helloworld.exe,则弹出了如下图所示的警告对话框,提示缺少Qt5Cored.dl文件。
在这里插入图片描述
  可以想到应用程序运行是需要dll动态链接库的,所以应该去Qt的安装目录下寻找该文件。下面直接介绍一个简便方法():

  方法:可以直接将Qt的bin目录路径加入到系统Path 环境变量中去,这样程序运行时就可以自动找到bin目录中的dll文件了。
  步骤:具体做法是右击“计算机”,在弹出的级联菜单中选择“属性”,然后在弹出的系统属性对话框中选择“高级系统设置”项。单击“环境变量”按钮进入环境变量设置界面。在“系统变量”栏中找到Path变量,单击“编辑”弹出编辑系统变量对话框。在变量值的最后添加 “C:\Qt\6.4.3\mingw_64\bin”然后单击“确定”即可,操作步骤如下图所示(我的系统是win11)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  现在双击文件夹里的.exe文件就可以直接运行了。

2.2 程序的发布

  现在程序已经编译完成,那么怎样来发布它,让它在别人的计算机上也能运行呢? 前面生成的debug版本程序依赖的dll文件很大,那是因为debug版本程序中包含了调试信息,可以用来调试。而真正要发布程序时要使用release版本。下面回到Qt Creator 中对 helloworld 程序进行release版本的编译。在左下角的目标选择器(Target selector)中将构建目标设置为Release,然后单击运行图标。编译完成后再看项目目录中工程文件夹的release目录,其中已经生成了helloworld.exe文件。可以看一下它的大小,只有86KB,而前面的debug 版的 helloworld.exe 却有1.5MB,相差很大。
在这里插入图片描述
在这里插入图片描述
  如果前面已经添加了Path 系统环境变量,那么现在就可以直接双击运行该程序。如果要使 Release版本的程序可以在别人的计算机上运行(当然,对方计算机也要是 Windows 平台),还需要将几个dll文件与其一起发布。可以在桌面上新建一个文件夹,重命名为“我的第一个Qt程序”,然后将 release 文件夹中的helloworld.exe 复制过来,再去Qt安装目录的bin目录中将 libgcc_s_dw2-1.dll, libstdc+±6.dll、lib- winpthread-1.dll、Qt5Core.dll、Qt5Gui.dll和Qt5 Widgets.dll这6个文件复制过来。 另外,还需要将C:\Qt\6.4.3\mingw_64\plugins目录中的platforms 文件夹复制过来(不要修改该文件夹名称),里面只需要保留 qwindows.dll 文件即可。现在整个文件夹一共有19.3MB,如果使用WinRAR等打包压缩软件对它进行压缩,就只有 6MB了,已经到达了可以接受的程度,这时就可以将压缩包发布出去了。
在这里插入图片描述在这里插入图片描述

注意:若程序中使用了png 以外格式的图片,则发布程序时就要将Qt安装 目录下的 plugins 目录中的 imageformats文件夹复制到发布程序文件夹 中,其中只要保留自己用到的文件格式的dll文件即可。例如用到了 gif文件,那么只需要保留qgif.dll。如果程序中使用了其他的模块,比如数据库,那么就要将 plugins目录中的sqldrivers文件夹复制过来,里面只须保留用到的数据库dll文件。

  到这里就已经完成了开发一个应用程序的最基本流程。下面再来看一个经常被提到的概念:静态编译。静态编译是相对于前面讲到的动态编译而言的。就像前面看到 的一样,在Qt Creator 默认的情况下,编译的程序要想发布就需要包含dll文件,这种编译方式被称为动态编译。而静态编译就是将Qt的库进行重新编译,用静态编译的Qt库来链接程序,这样生成的目标文件就可以直接运行,而不再需要dll文件的支持。 不过这样生成的exe文件也就很大了,有好几MB,而且静态编译缺乏灵活性,也不能部署插件。从前面的介绍可以看到,其实发布程序时带几个dll文件并不是很复杂的事情,而且如果要同时发布多个应用程序,还可以共用dll文件,所以使用默认的方式就可以了。想了解更多Qt发布的知识和静态编译的方法,可以在Qt Creator 帮助的索引方式下通过 Deploying Qt Applications 关键字查看, Windows 平台发布程序对应 的关键字是Qt for Windows-Deployment。

2.3 设置应用程序图标

  若程序发布时想使exe文件有一个漂亮的图标,则可以在Qt Creator 的帮助索引 中查找 Setting the Application Icon 关键字,这里列出了在Windows上设置应用程序图标的方法,步骤如下:
  第一步,创建.ico文件(可以去一些ico网站上下载)。将ico图标文件复制到工程文件夹的 helloworld目录中, 重命名为“hello.ico”。
  第二步,修改项目文件。,在Qt Creator 中的编辑模式双击hello.pro文件,在最后面添加下面一行代码:

RC_ICONS = hello.ico

  第三步,运行程序。,可以看到窗口左上角的图标已经更换了。然后查看一下 release 文件夹中的文件,可以看到,现在exe文件已经更换了新的图标。
在这里插入图片描述
  现在只需要将这里的 helloworld.exe 复制到程序发布文件夹中,就可以得到一个完整而且漂亮的应用程序。对于整个流程而言,最后这步“设置应用程序图标”并不是必须的。这就是程序从创建到发布的整个过程。

三、往期回顾

【Qt学习笔记】(一)–Qt creator软件学习

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法刷题Day1 | 704.二分查找、27.移除元素

目录 0 引言1 二分查找1.1 我的解题1.2 修改后1.3 总结 2 移除元素2.1 暴力求解2.2 双指针法(快慢指针) 🙋‍♂️ 作者:海码007📜 专栏:算法专栏💥 标题:代码随想录算法训练营第一天…

Vue.js+SpringBoot开发大病保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大病保险管理2.4 大病登记管理2.5 保险审核管理 三、系统详细设计3.1 系统整体配置功能设计3.2 大病人员模块设计3.3 大病保险模块设计3.4 大病登记模块设计3.5 保险审核模块设计 四、…

MySQL三种日志

一、undo log(回滚日志) 1.作用: (1)保证了事物的原子性 (2)通过read view和undo log实现mvcc多版本并发控制 2.在事务提交前,记录更新前的数据到undo log里,回滚的时候读…

数据可视化助力林业智能管理

数据可视化是当下科技发展中的一项重要工具,它在各行各业都展现了强大的应用价值。在智慧林业领域,数据可视化更是发挥了独特的作用,为林业管理和生态保护提供了有效的支持和解决方案。下面我就以可视化从业者的角度,来简单聊聊这…

四节点/八节点四边形单元悬臂梁Matlab有限元编程 | 平面单元 | Matlab源码 | 理论文本

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

关于yolov8的DFL模块(pytorch以及tensorrt)

先看代码 class DFL(nn.Module):"""Integral module of Distribution Focal Loss (DFL).Proposed in Generalized Focal Loss https://ieeexplore.ieee.org/document/9792391"""def __init__(self, c116):"""Initialize a convo…

嵌入式C语言(六)

对齐这个事情在内核中可不是个什么小事,内核中涉及到内存方面的都需要非常的谨慎。 上一篇我们知道了可以通过__attribute__来声明属性,也知道了section这个属性,这篇我们来看看关于内存对齐使用的两个属性–>aligned和packed 地址对齐&…

Altium Designer如何对走线模式进行切换

AD软件提供了比较智能的走线模式切换功能,可以根据个人习惯进行切换,能有效的提高了PCB设计效率。 点击界面右上角系统参数的图标 或者在pcb界面中使用快捷键OP进入到优选项界面,然后选中 PCB Editor-Interactive Routing,在布线…

ubuntu設定QGC獲取pixhawk Mini4(PX4 Mini 4) 的imu信息

ubuntu20.04 QGC使用v4.3.0的版本 飛控pixhawk Mini4 飛控上只使用一條micro USB連接電腦,沒有其他線 安裝命令 sudo apt-get remove modemmanager -y sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y sudo apt install libf…

Vue:纯前端实现文件拖拽上传

先看一下拖拽相关的事件:dragover、dragenter drop和dragleave 。 dragover事件:当被拖动的元素在一个可放置目标上方时,该事件会被触发。 通常,我们会使用event.preventDefault()方法来取消浏览器默认的拖放行为,以便…

amv是什么文件格式?如何播放amv视频?

AMV文件格式源自于中国公司Actions Semiconductor,最初作为其MP4播放器中使用的专有视频格式。产生于数码媒体发展的需求下,AMV格式为小屏幕便携设备提供了一种高度压缩的视频存储方案。 AMV文件格式的主要特性与使用场景 AMV格式以其独特的特性在小尺寸…

复合式统计图绘制方法(7)

复合式统计图绘制方法(7) 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制,饼图环形图绘制较难。 在统计图的应用方面,有时候有两个关联的统计学的样本值要用统计图来表达&#xff0…

运动想象 (MI) 迁移学习系列 (5) : SSMT

运动想象迁移学习系列:SSMT 0. 引言1. 主要贡献2. 网络结构3. 算法4. 补充4.1 为什么设置一种新的适配器?4.2 动态加权融合机制究竟是干啥的? 5. 实验结果6. 总结欢迎来稿 论文地址:https://link.springer.com/article/10.1007/s11517-024-0…

天府锋巢直播产业基地:直播带岗,成都直播基地奔向产业化

天府锋巢直播产业基地位于成都市天府新区科学城板块,是一座集直播带岗、电商孵化、产业培训、供应链整合等多功能于一体的现代化全域直播产业基地。近年来,随着成都直播产业的蓬勃发展,成都积极响应市场需求,致力于打造出西部地区…

linux进程间通信-共享内存

一、共享内存是什么 在Linux系统中,共享内存是一种IPC(进程间通信)方式,它可以让多个进程在物理内存中共享一段内存区域。 这种共享内存区域被映射到多个进程的虚拟地址空间中,使得多个进程可以直接访问同一段物理内存…

【Python可视化系列】一文教你绘制雷达图(源码)

这是我的第234篇原创文章。 一、引言 雷达图是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多变量数据的图形方法,也称为蜘蛛图或星形图。雷达图通常用于综合分析多个指标,具有完整,清晰和直观的优点。通常由多个等…

Constrained Iterative LQR 自动驾驶中使用的经典控制算法

Motion planning 运动规划在自动驾驶领域是一个比较有挑战的部分。它既要接受来自上层的行为理解和决策的输出,也要考虑一个包含道路结构和感知所检测到的所有障碍物状态的动态世界模型。最终生成一个满足安全性和可行性约束并且具有理想驾驶体验的轨迹。 通常,motion plann…

遥感影像植被波谱特征总结

植被跟太阳辐射的相互关系有别于其他物质&#xff0c;如裸土、水体等&#xff0c;比如植被的“红边”现象&#xff0c;即在<700nm附近强吸收&#xff0c;>700nm高反射。很多因素影响植被对太阳辐射的吸收和反射&#xff0c;包括波长、水分含量、色素、养分、碳等。 研究…

Kubernetes--ingress实现七层负载

目录 一、传统方式&#xff1a;不借助ingress实现七层代理 二、nginx-ingress 三、使用ingress实现七层代理 四、部署ingrss-nginx及功能 五、样例 1.Ingress-nginx HTTP代理访问 2.Ingress HTTPS代理访问&#xff08;会话卸载层&#xff09; 3.Nginx进行BasicAuth&…

亚马逊店铺解决和预防订单下滑的技巧

1. 保持账号的良好表现。不要销售侵权产品&#xff0c;发货要及时&#xff0c;能有追踪号的就带可查询追踪号&#xff0c;能发FBA的就通过FBA发货。 2. 持续做好产品优化工作&#xff0c;及时留意大环境的变化和平台政策变动。遇到编辑权限受限&#xff0c;可开case咨询或申请…