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

news2025/1/12 19:50:05

   声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。
   因为我个人对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软件学习

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

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

相关文章

HTML 学习笔记(十一)表单

一、分块 1.单行文本框控件–文本框和密码框 文本框控件通过单标签input实现,其具有必要属性type来控制输入控件的类型(默认为text即文本信息),密码框的type为password(口令)。   表单的动作属性定义了目的文件的文件名。由动作属性定义的这个文件通常…

Qt QDateTime类使用

一.Qt datetime 介绍 Qt中的QDateTime类是用于处理日期和时间的组合的类,它提供了丰富的功能来操作和格式化日期时间数据。以下是其主要特点和用法: 构造函数:QDateTime可以通过组合QDate(日期)和QTime(时…

C++感受2-逐字逐句,深入理解C++最小例程

以 “Hello World” 例程为载体、线索,在完成 “间接名字空间限定” 写法转换到“直接名字空间限定”的过程,同时掌握函数、主函数、函数调用、级联操作、声明、类型、int、字符串类型、头文件包含、行为数据、流输出操作符、标准输出流对象、标准库名字…

LeetCode.2129. 将标题首字母大写

&#x1f354;题目 2129. 将标题首字母大写 &#x1f35f;分析 这道题目描述的很清晰&#xff0c;我们只需要将给定的字符串按照空格划分成字符串数组 str&#xff0c;然后判断 str[i] 的长度如果 <2 &#xff0c;则将 str[i] 转为小写&#xff0c;如果 str[i] 的长度 &g…

Python批量提取Word文档表格数据

在大数据处理与信息抽取领域中&#xff0c;Word文档是各类机构和个人普遍采用的一种信息存储格式&#xff0c;其中包含了大量的结构化和半结构化数据&#xff0c;如各类报告、调查问卷结果、项目计划等。这些文档中的表格往往承载了关键的数据信息&#xff0c;如统计数据、项目…

CSS 用 flex 布局绘制骰子

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.box {height: 100px;width: 100px;border: 2px solid grey;border-radius: 10px;display: flex;justify-content: center; // 水平居中/* alig…

new-easy(pwn)

1.进行查壳 栈保护&#xff0c;三个保护都开了 NX保护 NX保护在Windows中也被成为称为DEP&#xff0c;是通过现代操作系统的内存单元&#xff08;Memory Protect Unit &#xff0c;MPU&#xff09;机制对程序内存页的粒度进行权限设置&#xff0c;其基本规则为可写权限与可执…

简述类与对象

一、两者关系 类是Java语言中最重要的数据类型&#xff0c;用于创建具体实例&#xff08;对象&#xff09; 抽象出一类事物共有的属性和行为&#xff0c;即数据以及数据上的操作 类是对现实事物的模拟&#xff0c;包含属性&#xff08;成员变量&#xff09;和行为&#xff0…

python读取大型csv文件,降低内存占用,提高程序处理速度

文章目录 简介读取前多少行读取属性列逐块读取整个文件总结参考资料 简介 遇到大型的csv文件时&#xff0c;pandas会把该文件全部加载进内存&#xff0c;从而导致程序运行速度变慢。 本文提供了批量读取csv文件、读取属性列的方法&#xff0c;减轻内存占用情况。 import pand…

2024.3.12 C++

1.思维导图 2.自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height),定义公有成员函数: 初始化函数:void init(int w, int h)更改宽度的函数:set_w(int w)更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <iostream…

python(ogr)处理geojson为本地shp文件

前言 本次所利用的geojson数据来自https://geo.datav.aliyun.com/areas_v3/bound/410000_full.json &#xff0c;如果觉得下方代码看起来不方便&#xff0c;可以来GitHub上来看&#xff0c;在这上面还有一些辅助内容便于理解 GISpjd/GIS-union-Python (github.com)https://gi…

【2024.03.12】定时执行专家 V7.2 发布 - TimingExecutor V7.2 Release

目录 ▉ 软件介绍 ▉ 新版本 V7.2 下载地址 ▉ V7.2 新功能 ▼2024-03-12 V7.2 - 更新日志 ▉ V7.x 新UI设计 ▉ 软件介绍 《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件。软件具有 25 种【任务类型】、12 种【触发器】触发方式&#x…

Linux内核介绍and下载

Linux内核介绍and下载 介绍下载下载历史版本 我是将军我一直都在&#xff0c;。&#xff01; 介绍 ● Linux是c语言写成的 ● 符合POSIX标准 ● 作者是芬兰的Linus Torvalds ● 发展依赖于五个重要支柱: unix操作系统、minix操作系统、 GNU计划、POSIX标准和互联网 ● 2.6之后…

WebSocket:实现客户端与服务器实时通信的技术

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

CodeSys通过C函数接口调用Qt

文章目录 1.背景介绍2.修改makefile2.1.将编译器由c改成c2.2.使能opencv库2.3.使能Qt库 3.在代码中使用Qt库函数 1.背景介绍 建议先查看之前的文章【CodeSys中调用C语言写的动态库】&#xff0c;了解如何创建一个能够被codesys调用的动态库。 假如想要在函数中使用Qt或者第三方…

Vue3全家桶 - Vue3 - 【8】模板引用【ref】(访问模板引用 + v-for中的模板引用 + 组件上的ref)

模板引用【ref】 Vue3官网-模板引用&#xff1b;如果我们需要直接访问组件中的底层DOM元素&#xff0c;可使用vue提供特殊的ref属性来访问&#xff1b; 一、 访问模板引用 在视图元素上采用ref属性来设置需要访问的DOM元素&#xff1a; 该 ref 属性可采用 字符串 值的执行设…

【基于langchain + streamlit 完整的与文档对话RAG】

本地部署文档问答webdemo 支持 pdf支持 txt支持 doc/docx支持 源文档索引 你的点赞和收藏是我持续分享优质内容的动力哦~ 废话不多说直接看效果 准备 首先创建一个新环境&#xff08;选择性&#xff09; conda create -n chatwithdocs python3.11 conda activate chatwith…

Promise其实也不难

难点图解&#xff1a;then&#xff08;&#xff09;方法 ES6学习网站&#xff1a;ES6 入门教程 解决&#xff1a;回调地狱&#xff08;回调函数中嵌套回调&#xff09; 两个特点&#xff1a; &#xff08;1&#xff09;对象的状态不受外界影响。Promise对象代表一个异步操作&…

Linux常见指令总结

ls&#xff1a;显示当前目录下文件列表 常用的命令行参数&#xff1a; -l 显示更多的文件属性 -a 显示所有的文件/目录&#xff08;包括隐藏的&#xff09; -d 只显示目录 ps&#xff1a;参数可以叠加使用。 例如&#xff1a;ls -la 显示所有文件…

力扣刷题Days16(js)-67二进制求和

目录 1,题目 2&#xff0c;代码 2.1转换进制数 2.2模拟加法 3&#xff0c;学习与总结 Math.floor() 模拟加法思路回顾 重点复习巩固 模拟加法的思路和学习位运算&#xff1b; 今天没精力了&#xff0c;先休息 1,题目 给你两个二进制字符串 a 和 b &#xff0c;以二进制…