当前位置: 首页 > news >正文

【QT】:QT图形化界面概述

  1. Qt背景介绍
    1.1 什么是Qt
    Qt 是⼀个跨平台的C++图形⽤⼾界⾯应⽤程序框架。它为应⽤程序开发者提供了建⽴艺术级图形
    界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt为开发者提供了⼀种基于组件的开发模
    式,开发者可以通过简单的拖拽和组合来实现复杂的应⽤程序,同时也可以使⽤C++语⾔进⾏⾼级开发

图形⽤⼾界⾯:指采⽤图形⽅式显⽰的计算机操作⽤⼾界⾯,是计算机与其使⽤者之间的对话接⼝,
是计算机系统的重要组成部分。如下分别是:Android⼿机图形⽤⼾界⾯和IOS⼿机图形⽤⼾界⾯。
1.2 Qt的发展史
1991 年Qt最早由奇趣科技开发;
1996 年进⼊商业领域,它也是⽬前流⾏的Linux桌⾯环境KDE的基础;
2008 年奇趣科技被诺基亚公司收购,Qt成为诺基亚旗下的编程⼯具;
2012 年Qt⼜被Digia公司收购;
2014 年4⽉跨平台的集成开发环境QtCreator3.1.0发布,同年5⽉20⽇发布了Qt5.3正式版,⾄
此Qt实现了对IOS、Android、Embedded等各平台的全⾯⽀持。
1.3 Qt⽀持的平台
Windows‒XP、Vista、Win7、Win8、Win2008、Win10

Unix/X11‒Linux、SunSolaris、HP-UX、CompaqTru64UNIX、IBMAIX、SGIIRIX、FreeBSD、
BSD/OS、和其他很多X11平台

Embedded‒有帧缓冲⽀持的嵌⼊式Linux平台,WindowsCE
Android
1.4 Qt版本
⽬前最新的版本是Qt6.但是相对来说Qt6和Qt5之间的核⼼功能区别不⼤.并且企业中也仍然有⼤量
的项⽬在使⽤Qt5.
因此咱们课堂上仍然使⽤Qt5版本来进⾏介绍.
另外Qt在发布的时候还提供了两种许可证.
商业许可:开发者以商业⽬的使⽤Qt框架进⾏开发和发布软件的许可,开发者需要购买商业许可并
按照相关规定使⽤Qt框架。商业许可提供了更多的功能和服务,适合于商业软件开发。
开源许可:开发者以⾮商业⽬的使⽤Qt框架进⾏开发和发布软件的许可,开发者可以免费使⽤Qt框
架,但需要遵守开源许可协议的要求,如在软件中包含Qt许可协议的声明等。
接⼝简单,容易上⼿,学习QT框架对学习其他框架有参考意义。
⼀定程度上简化了内存回收机制;
开发效率⾼,能够快速的构建应⽤程序。
有很好的社区氛围,市场份额在缓慢上升
可以进⾏嵌⼊式开发。
1.6 Qt的应⽤场景
桌⾯应⽤程序
Qt 能够创建各种类型的桌⾯应⽤程序,包括⽂件管理器、媒体播放器、绘图程序等。Qt应⽤程序⽀持
多种操作系统,可以运⾏在Windows、Linux、macOS等桌⾯操作系统上
移动应⽤程序
Qt ⽀持Android和IOS移动操作系统,为应⽤程序提供了强⼤的跨平台能⼒。可以使⽤Qt构建各种
移动应⽤程序,例如社交应⽤、游戏、娱乐等
嵌⼊式系统
Qt 在嵌⼊式领域应⽤⾮常⼴泛,它可以构建⾯向各种设备的图形应⽤程序,在机顶盒、⻋载娱乐系
统、安防监控设备等领域具有⼴泛的应⽤
1.7 Qt的成功案例
Linux 桌⾯环境KDE
在这里插入图片描述

Skype⽹络电话。Skype是⼀款即时通讯软件,其具备IM所需的功能,⽐如视频聊天、多⼈语⾳会
议、多⼈聊天、传送⽂件、⽂字聊天等功能。它可以⾼清晰与其他⽤⼾语⾳对话,也可以拨打国内国
际电话,⽆论固定电话、⼿机均可直接拨打,并且可以实现呼叫转移、短信发送等功能
在这里插入图片描述
1.8 Qt的发展前景及就业分析
Qt 是⼀个强⼤且⼴泛应⽤于跨平台软件开发的框架。它提供了丰富的⼯具和库,可⽤于开发⾼质量、
⾼效率的图形⽤⼾界⾯(GUI)应⽤程序。并且可以在Windows、linux、macOS等多种操作系统上
运⾏。随着⾏业的发展,Qt的重要性也逐渐体现出来,下⾯从⾏业发展⽅向、就业⽅⾯的发展前景以
及就业薪资分析Qt的发展前景。
⾏业发展⽅向
物联⽹(IoT)和嵌⼊式系统的发展:
在当下的嵌⼊式和物联⽹⾏业中,Qt的作⽤逐渐得到了体现,因为可以⽤它来开发具有GUI界⾯的嵌
⼊式应⽤程序,这对于智能家居、汽⻋以及医疗设备等领域来说,具有⾮常重要的作⽤。•
⾃动驾驶和智能交通领域:
现在很多的汽⻋都引⼊了⾃动驾驶的技术,⽽Qt在其中也有着⼴泛的应⽤,它可以开发⻋载嵌⼊式系
统和⽤⼾界⾯程序。随着未来⾃动驾驶技术的发展,Qt在这⽅⾯的需求也会不断地增多。
游戏开发:

Qt 有⼀些⾮常重要的功能模块,例如Qt3DStudio,可以应⽤于游戏开发。未来游戏⾏业的持续发
展,Qt在游戏⾏业的发展将会越来越多。
就业⽅⾯的发展前景:
⼴泛的就业机会:
Qt 在各个⾏业的应⽤逐渐⼴泛起来,对于掌握Qt开发能⼒的⼈员需求也在不断增加,因此在就业⽅
⾯,相对⽐于其他⾏业来说,Qt就业⾯更⼴,选择性更多。
⾼薪⽔和职业发展机会:
Qt 作为⼀项专业技能,掌握此项技术的开发者获得的薪资报酬也是⾮常可观的,具有更多的职业发展
机会。总之就是,如果掌握了Qt开发技术,未来的发展前景还是⾮常不错的。

  1. 搭建Qt开发环境
    2.1 Qt的开发⼯具概述
    Qt ⽀持多种开发⼯具,其中⽐较常⽤的开发⼯具有:QtCreator、VisualStudio、Eclipse.
    1、QtCreator
    Qt Creator 是⼀个轻量级的跨平台集成开发环境(IDE),专为使⽤Qt框架进⾏应⽤程序开发⽽设

    它是⼀个功能强⼤、易于使⽤、快速且⾼效的⼯具,被⼴泛⽤于编写各种类型的应⽤程序,如桌⾯应
    ⽤程序、移动应⽤程序和嵌⼊式系统等。
    Qt Creator 提供了⼀个可视化的界⾯设计器和代码编辑器,可以帮助开发者更快捷地创建复杂的⽤⼾
    界⾯和处理各种事件。
    它还包含了调试⼯具、版本控制⼯具、⾃动完成和智能提⽰等功能,以及⽀持多语⾔和跨平台的开发
    环境。
    QtCreator 的主要特点包括:
    紧密集成的Qt框架:QtCreator专⻔为Qt开发⽽设计,因此它与Qt框架集成得⾮常紧密,使开
    发者可以更容易地管理和部署他们的应⽤程序。
    强⼤的编辑器:QtCreator具有⼀些先进的编辑器功能,如语法⾼亮、代码折叠、智能提⽰、⾃动
    完成和代码重构。
    集成调试器:QtCreator内置了调试器,允许开发⼈员在代码中设置断点以及检查变量、堆栈和
    调⽤树等信息。
    ⾼效的构建系统:QtCreator提供了⼀个⾼效的构建系统,可以⾃动构建和部署应⽤程序,同时⽀
    使⽤不同的编译器和平台。
    可视化界⾯设计器:QtCreator具有⼀个可视化界⾯设计器,它允许开发⼈员在没有编写代码的情
    况下创建复杂的⽤⼾界⾯。
    多语⾔⽀持:QtCreator⽀持多种编程语⾔,包括C++、QML、JavaScript等。
    总⽽⾔之,QtCreator是⼀个功能⻬全、易于使⽤且⾼效的跨平台IDE,适⽤于各种类型的应⽤程序开
    发,特别是那些使⽤Qt框架的开发者。

2、VisualStudio
Visual Studio 是由微软公司开发的集成开发环境(IDE)。它可以⽤来开发多种类型的应⽤程序。包括
Windows桌⾯应⽤程序、Web应⽤程序、移动应⽤程序、游戏等。VisualStudio提供了丰富的开发⼯
具和功能,包括代码编辑器、调试器、⾃动完成、代码重构、版本控制等等。它⽀持多种编程语⾔,
如:C++、C#、VisualBasic、F#、Python等。VisualStudio还可以与其他开发⼯具和服务集成,如
Azure 云服务、GitHub、Jenkins等。
Visual Studio 具有以下⼀些主要特点:
多语⾔⽀持:VisualStudio⽀持多种编程语⾔,包括C++、C#、VisualBasic、F#、Python、
JavaScript 等;
丰富的⼯具集:VS提供了各种开发⼯具,包括代码编辑器、调试器、代码分析⼯具等,以提⾼开⼈员的效率;
可视化设计:VS提供了可视化的设计⼯具,如窗体设计器、WPF设计器等,使开发⼈员可以直观
地设计⽤⼾界⾯;
跨平台开发:VS⽀持跨平台开发,可以开发适⽤于Windows、Linux和macOS等多个平台的应
⽤程序;
集成的调试器:VS集成了强⼤的调试器,可以进⾏代码的单步调试、断点调试等操作来帮助开发
⼈员查找和修复错误;
丰富的扩展性:VS可以通过安装扩展来扩展其功能,开发⼈员可以根据⾃⼰的需求选择并安装适
合的扩展。
3、Eclipse
Eclipse 是著名的跨平台的⾃由集成开发环境(IDE)。最初主要⽤来Java语⾔开发,但是⽬前亦有⼈
通过插件使其作为其他计算机语⾔⽐如C++和Python的开发⼯具。Eclipse的本⾝只是⼀个框架平
台,但是众多插件的⽀持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件
开发商以Eclipse为框架开发⾃⼰的IDE。Qt框架可以与Eclipse集成,使开发者可以使⽤Eclipse的
强⼤功能来开发Qt应⽤程序
2.2 QtSDK的下载和安装

2.2.1 Qt SDK的下载
Qt下载官⽹:http://download.qt.io/archive/qt/
国内清华源: https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/
进⼊官⽹,按如下图⽰进⾏相应的系统版本下载即可。
1、打开官⽹链接,进⼊如下图⽰界⾯
2、选择需要下载的版本;(本课件以5.14版本为例,所选具体版本为:5.14.2

模式选择;
欢迎模式主要提供了⼀些功能的快捷⼊⼝,如打开帮助教程、打开⽰例程序、打开项⽬、新建项⽬、快速打
开以前的项⽬和会话、联⽹查看Qt官⽅论坛和博客等。⽰例⻚⾯显⽰了Qt⾃带的⼤量⽰例程序,
并提供了搜索栏从⽽实现快速查找;教程⻚⾯提供了⼀些视频教程资源,但是是英⽂的。
编辑模式主要⽤来查看和编辑程序代码,管理项⽬⽂件。QtCreator中的编辑器具有关键字特殊颜⾊显⽰、
代码⾃动补全、声明定义间快捷切换、函数原型提⽰、F1键快速打开相关帮助和全项⽬中进⾏查找
等功能。也可以在"⼯具---->选项"菜单中对编辑器进⾏设置。
设计模式
整合了QtDesigner的功能。可以设计图形界⾯,进⾏部件属性设置、信号和槽设置、布局设置等
操作。
调试模式
⽀持设置断点、单步调试和远程调试等功能,包含局部变量和监视器、断点、线程以及快照等查看
窗⼝。
项⽬模式
包含对特定项⽬的构建设置、运⾏设置、编辑器设置、代码⻛格设置和依赖关系等⻚⾯。构建设置
中可以对项⽬的版本、使⽤的Qt版本和编译步骤进⾏设置;编辑器设置中可以设置⽂件的默认编
码;在代码⻛格设置中可以设置⾃⼰的代码⻛格。
帮助模式
在帮助模式中将Qt助⼿整合了进来,包含⽬录、索引、查找和书签等⼏个导航模式,可以在帮助中
查看Qt和QtCreator的各⽅⾯信息。
③:构建套件选择器。构建套件选择器包含了⽬标选择器(Targetselector)、运⾏按钮(Run)、调
试按钮(Debug)和构建按钮(Building)四个图标。
⽬标选择器
⽬标选择器⽤来选择要构建哪个项⽬、使⽤哪个Qt库、这对于多个Qt库的项⽬很有⽤。还可以
选择编译项⽬的debug版本或是release版本。
运⾏按钮运⾏按钮可以实现项⽬的构建和运⾏;
调试按钮运⾏按钮可以实现项⽬的调试;
构建按钮构建按钮完成项⽬的构建。
④:欢迎模式下的窗⼝⼯作⽅式

Project
⽰例
⽤来新建⼯程、打开⼯程
Qt官⽅的⼀些⽰例
教程
Qt官⽅教程
⑤:定位器。使⽤定位器来快速定位项⽬、⽂件、类、⽅法、帮助⽂档以及⽂件系统。可以使⽤过滤
器来更加准确地定位要查找的结果。
⑥:输出窗格。输出窗格包含了问题、搜索结果(SearchResults)、应⽤程序输出、编译输出、
DebuggerConsole、概要信息、测试结果(TestResults)7个选项,它们分别对应⼀个输出窗⼝,响
应的快捷键依次是Alt+数字1~7。
问题
问题窗⼝显⽰程序编译时的错误和警告信息;
Search Results
搜索结果窗⼝显⽰执⾏了搜索操作后的结果信息;
应⽤程序输出
应⽤程序窗⼝显⽰应⽤程序运⾏过程中输出的所有信息;
编译输出
编译输出窗⼝显⽰程序编译过程输出的相关信息

⑦:会话记录;可以对会话进⾏管理,包括Clone。如果没打开⼯程,则显⽰的是最后⼀次打开的
(会话)⼯程,否则,显⽰当前的会话(⼯程)。
⑧:新建项⽬;
⑨:打开已有项⽬;

3.2 使⽤QtCreator新建项⽬
3.2.1 新建项⽬
打开QtCreator,在菜单栏中选中:“⽂件”--------> “新建⽂件或项⽬”;或者使⽤快捷键:Ctrl+
n;或者直接点击:“new”
新建项⽬对话框⾥有五类项⽬模板:
项⽬模板
说明
Application
Qt 应⽤程序,包括普通窗体程序和QtQuick程序
Library
可以创建动态库、静态库以及QtQuick扩展插件、QtCreator⾃⾝插件
其他项⽬
可以创建单元测试项⽬、Qt4设计师⾃定义控件、⼦⽬录项⽬等
Non-Qt-Project
⾮Qt项⽬。可以创建纯C或纯C++项⽬
Import Project
导⼊项⽬。从版本控制系统管理的软件项⽬导⼊旧的项⽬
常⽤的只有第⼀类Application,选择它,在右侧会看到Qt应⽤程序的五个⼦模板:

QtWidgetsApplication:普通窗体模板,传统基于部件的窗体界⾯程序。

QtConsoleApplication:Qt控制台应⽤程序。因为Qt主要⽤于图形界⾯设计,这个控制台项⽬
模板基本不⽤。

QtforPython:在Python下⽤LGPL的许可来开发闭源Qt软件。

QtQuickApplication:Qt提供的⼀种⾼级⽤⼾界⾯技术,使⽤它可以⽅便快速的为移动以及嵌⼊
式设备开发流畅美观的⽤⼾界⾯。QtQuick模块是开发QML应⽤的标准库,提供了使⽤QML创建
⽤⼾界⾯所需的⼀切,包括可视化、交互、动画、模型、视图、粒⼦效果以及着⾊效果等
Qt 中的构建⼯具有三种可供选择,分别是:qmake、CMake、Qbs,下⾯依次介绍。

qmake:qmake是⼀个构建⼯具(buildtool),⽤于⾃动⽣成makefile⽂件。qmake⽀持跨平
台构建。qmake编辑的是⼀个后缀名为.pro的⽂件。

CMake:CMake是⼀个跨平台的构建⼯具。CMake本⾝不是⼀个编译器,其实就是⽣成⼀个让编
译器能读懂编译流程的⽂件⼯具。让CMake⾃动⽣成构建系统,例如Makefile和VisualStudio
项⽬⽂件。CMake是⼀个第三⽅⼯具,有⾃⼰的⽂档。

Qbs:Qbs(QtBuildSuite:Qt构建套件)同qmake、CMake⼀样都是构建⼯具。Qbs号称是新
⼀代的构建⼯具,⽐qmake编译速度更快。Qbs没有绑定Qt版本,它从项⽬⽂件的⾼级项⽬描述
中⽣成⼀个正确的依赖表。⽽传统的MakeFile⽣成⼯具如qmake和CMake,其在⽣成MakeFile
⽂件后将实际的命令交给Make⼯具去执⾏。
Qt官⽅声明,因市场原因,弃⽤Qbs。对于Qt⽤⼾来说,qmake是当前使⽤最⼴泛的构建⼯具,
CMake其次。
3.2.5 填写类信息设置界⾯

对于基类的选择,⽬前有三种基类:
基类
说明
QMainWindo
w
主窗⼝类,⼀般⽤于较为复杂的应⽤程序,除了中央客⼾区界⾯,还包括菜单栏、⼯具栏、
状态栏以及多个可停靠的⼯具对话框等
QWidget
QDialog
最简单、最基本的窗体程序,⾥⾯可以放置多个控件实现程序功能
基于对话框的程序,对话框⼀般⽤于弹窗,也可以⽤于主界⾯显⽰。对话框是从QWidget继
承⽽来的,并丰富了⼀些功能,如模态显⽰和返回值等
上述三个类之间的关系如下图

3.2.6 选择语⾔和翻译⽂件
点击"下⼀步"进⼊如下界⾯:
此处选择的语⾔是"汉语",“英语"这样的语⾔.⽽不是"编程语⾔”.
由于我们暂时不考虑国际化问题,直接下⼀步即可.
视图类型说明
项⽬即项⽬⽂件管理视图,可以选择项⽬⾥的⽂件进⾏编辑,包括pro⽂件也可以⼿动编辑。
打开⽂档当前已经打开的⽂件列表,⽂件名右边如果有号,是该⽂件被修改了但尚未保存。
书签右击代码编辑器⾏号位置,看到"切换书签",可以给代码⾏添加书签,⽅便跳转到该位
置。
⽂件系统相当于系统⾥的⽂件资源管理器,可以查看项⽬⽂件夹在磁盘⾥的实际⽂件列表。
类视图可以查看项⽬⾥包含的类及相应源代码⽂件⾥的成员函数、成员变量。
GitBranches查看当前分⽀
⼤纲编辑器所显⽰的当前⽂件的⼤纲列表,如名字空间、类名、成员函数、成员变量等。
Tests测试
类型层次当前项⽬包含的类及其基类、派⽣类列表。
Include
Hierarchy
包含视图,显⽰当前项⽬⾥
.h、*.cpp以及Qt类库头⽂件之间的包含关系。

①和②:导航按钮"返回"和"前进",这与⽹⻚浏览器的前进和后退按钮类似,可以在之前浏览的多个
代码⽂件或⼀个代码⽂件⾥多个位置之间快速切换。
③:标识当前显⽰的⽂件是只读还是可写,⼀般都是可写的。
④:⽂件类型图标,当前显⽰⽂件的类型,这个控件其实是⼀个菜单按钮,点击可以弹出丰富的⽂件
处理功能菜单。
⑤:打开的⽂件名,可以在多个打开的⽂件之间选择切换,与边栏的"打开⽂档"视图是对应的。
⑥:关闭当前显⽰的⽂档。
⑦:为当前显⽰的⽂件添加额外的C++预处理指令,⼀般⽤不着。
⑧:选择符号,可以在当前显⽰的⽂件⾥多个函数、类、成员变量等之前快速切换,与边栏"⼤纲"视
图是对应的。
⑨:编辑区光标的⾏号和列号。
⑩:代码编辑区分栏,可以增加多个编辑器窗⼝,显⽰多个打开的⽂档或显⽰较⼤源码⽂件的多个位
置。
⾏⾸区:主要⽤来显⽰代码⾏号,以及调试断点标志和代码书签标志。右击⾏⾸区可以弹出右键菜
单,菜单⾥可以切换书签、编辑书签以及设置或取消断点。
同⼀⾏是既可以打断点也可以设置书签的,⼆者不冲突,其实它们根本就没关系。单击⾏号前⾯的浅
灰⾊空⽩区可以直接打断点,再次单击可以取消断点,另外也可以⽤快捷键F9设置或取消断点。代码
书签⼀般⽤右键菜单来设置,也可以⽤快捷键Ctrl+M设置或取消书签。
编辑区:写代码的区域。
①:组件选择窗⼝。组件选择窗⼝分为多个组,如Layouts、Buttons、DisplayWidgets等,界⾯设
计的常⻅组件都可以在组件选择窗⼝中找到。
②:UI设计窗⼝。如果要将某个组件放置到该窗⼝上时,从组件选择窗⼝上拖放⼀个组件到窗体上即
可。
③:动作编辑窗⼝。动作编辑窗⼝包括ActionEditor以及Signals和Slots编辑器。ActionEditor主
要是⽤来新建Action,并且通过拖拽的动作,将新建好的Action添加到菜单栏和⼯具栏上;Signals
和Slots编辑器⽤于可视化地进⾏信号与槽的关联。
④:对象浏览窗⼝。⽤树状视图显⽰窗体上各组件之间的布局包含关系,视图有两列,显⽰每个组件
的对象名称(ObjectName)和类名称。
⑤:属性设置窗⼝。显⽰某个选中的组件或窗体的各种属性及其取值,可以在属性设置窗⼝⾥修改这
些属性的值。

如果项⽬配置了多个可⽤的Qt套件,点开左下⻆第⼀个按钮后,会看到各个套件以及构建类型,如果
要切换Qt套件或构建类型,直接选中相应条⽬,然后点击运⾏按钮就⾏了。如果构建和运⾏时没出
错,就会显⽰出构建好的⽬标程序界⾯。

第⼆个是运⾏按钮,快捷键是Ctrl+R,如果还没构建项⽬或刚修改了代码,直接点击运⾏的话,
QtCreator 会⾃动构建⽣成新的⽬标程序并运⾏。

第三个是调试按钮,快捷键是F5。调试程序之前,QtCreator会⾃动构建⽣成最新的⽬标程序,并
进⼊调试模式。

第四个是构建按钮,快捷键是Ctrl+B,只构建最新的⽬标程序,但不运⾏

双击进⼊该⽂件,该⽂件的核⼼内容如下:
QT +=coregui
// Qt 包含的模块
greaterThan(QT_MAJOR_VERSION, 4): QT+=widgets //⼤于Qt4版本才包含widget模块
TARGET=QtFirst
TEMPLATE=app
//应⽤程序名⽣成的.exe程序名称
//模板类型,应⽤程序模板
SOURCES+=main.cpp\ //源⽂件
widget.cpp
//源⽂件
HEADERS+=widget.h //头⽂件
“.pro” ⽂件的写法如下:

  1. 注释:从"#"开始,到这⼀⾏结束

  2. greaterThan(QT_MAJOR_VERSION,4): QT+=widgets 这条语句的含义是,如果
    QT_MAJOR_VERSION ⼤于4也就是当前使⽤的Qt5及更⾼版本)需要增加widgets 模块。如果
    项⽬仅需⽀持Qt5,也可以直接
    添加"QT+=widgets"⼀句。不过为了保持代码兼容,最好还是按照QtCreator⽣成的语句编写。

  3. 指定⽣成的应⽤程序名:TARGET=QtDemo

  4. TEMPLATE=app//模板。告诉qmake为这个应⽤程序⽣成哪种makefile。下⾯是可供选择的模
    板:
    ⚫app:建⽴⼀个应⽤程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使
    ⽤。
    ⚫lib:建⽴⼀个库的makefile。
    ⚫vcapp:建⽴⼀个应⽤程序的VisualStudio项⽬⽂件。
    ⚫vclib:建⽴⼀个库的VisualStudio项⽬⽂件。
    ⚫subdirs:这是⼀个特殊的模板,它可以创建⼀个能够进⼊特定⽬录的makefile并且为它调⽤
    make的makefile。

  5. ⼯程中包含的源⽂件:SOURCES+=main.cpp/widget.cpp

  6. ⼯程中包含的头⽂件:HEADERS+=widget.h

  7. ⼯程中包含的资源⽂件:RESOURCES+=painter.qrc

  8. ⼯程中包含的"ui"设计⽂件:FORMS+=widget.ui

  9. 配置信息:CONFIG+=c++11(使⽤c++11的特性) CONFIG⽤来告诉qmake关于应⽤程序的配
    置信息。

  10. Qt系统提供的标准类名声明头⽂件没有.h后缀;

  11. Qt⼀个类对应⼀个头⽂件,类名就是头⽂件名;

  12. QApplication 为应⽤程序类;QApplicationa;(a为应⽤程序对象,有且仅有⼀个。)
    ⚫QApplication管理图形⽤⼾界⾯应⽤程序的控制流和主要设置。
    ⚫QApplication是Qt的整个后台管理的命脉。它包含主事件循环,在其中来⾃窗⼝系统和其它
    资源的所有事件处理和调度。它也处理应⽤程序的初始化和结束,并且提供对话管理。
    ⚫对于任何⼀个使⽤Qt的图形⽤⼾界⾯应⽤程序,都正好存在⼀个QApplication对象,⽽不论
    这个应⽤程序在同⼀时间内是不是有0、1、2或更多个窗⼝。

  13. myWidgetw; //实例化窗⼝对象

  14. w.show();//调⽤show函数显⽰窗⼝

  15. a.exec() :程序进⼊消息循环,等待对⽤⼾输⼊进⾏响应。这⾥main()把控制权转交给Qt,Qt完
    成事件处理⼯作,当应⽤程序退出的时候exec()的值就会返回。在 exec()中,Qt 接受并处理⽤⼾
    和系统的事件并且把它们传递给适当的窗⼝部件。
    5.4 widget.cpp ⽂件解析
    widget.cpp ⽂件是类Widget的实现代码,所有在窗体上要实现的功能添加在此⽂件中;


当创建⼀个QObject对象时,会看到QObject的构造函数接收⼀个QObject指针作为参数,这
个参数就是parent,也就是⽗对象指针。

这相当于,在创建QObject对象时,可以提供⼀个其⽗对象,我们创建的这个QObject对象
会⾃动添加到其⽗对象的children()列表。

当⽗对象析构的时候,这个列表中的所有对象也会被析构。(注意,这⾥的⽗对象并不是继承
意义上的⽗类!)
这种机制在GUI程序设计中相当有⽤。例如,⼀个按钮有⼀个QShortcut(快捷键)对象作为其
⼦对象。当删除按钮的时候,这个快捷键理应被删除。这是合理的。

QWidget是能够在屏幕上显⽰的⼀切组件的⽗类。

QWidget继承⾃QObject,因此也继承了这种对象树关系。⼀个孩⼦⾃动地成为⽗组件的⼀
个⼦组件。因此,它会显⽰在⽗组件的坐标系统中,被⽗组件的边界剪裁。例如,当⽤⼾关闭
⼀个对话框的时候,应⽤程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该
⼀起被删除。事实就是如此,因为这些都是对话框的⼦组件。

当然,我们也可以⾃⼰删除⼦对象,它们会⾃动从其⽗对象列表中删除。⽐如,当我们删除了
⼀个⼯具栏时,其所在的主窗⼝会⾃动将该⼯具栏从其⼦对象列表中删除,并且⾃动调整屏幕
显⽰。
Qt引⼊对象树的概念,在⼀定程度上解决了内存问题。

当⼀个QObject对象在堆上创建的时候,Qt会同时为其创建⼀个对象树。不过,对象树中对象的
顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。

任何对象树中的QObject对象delete的时候,如果这个对象有parent,则⾃动将其从parent的
children() 列表中删除;如果有孩⼦,则⾃动delete每⼀个孩⼦。Qt保证没有QObject会被
delete 两次,这是由析构顺序决定的。
如果QObject在栈上创建,Qt保持同样的⾏为。正常情况下,这也不会发⽣什么问题。来看下⾯的代
码⽚段
在这里插入图片描述
6.4 认识对象模型(对象树)
在Qt中创建很多对象的时候会提供⼀个Parent对象指针,下⾯来解释这个parent到底是⼲什么的。
比特就业课

QObject是以对象树的形式组织起来的。
作为⽗组件的window和作为⼦组件的quit都是QObject的⼦类(事实上,它们都是QWidget的⼦
类,⽽QWidget是QObject的⼦类)。这段代码是正确的,quit的析构函数不会被调⽤两次,因为标
准C++要求,局部对象的析构顺序应该按照其创建顺序的相反过程。因此,这段代码在超出作⽤域
时,会先调⽤quit的析构函数,将其从⽗对象window的⼦对象列表中删除,然后才会再调⽤
window的析构函数。
但是,如果我们使⽤下⾯的代码
在这里插入图片描述
情况⼜有所不同,析构顺序就有了问题。我们看到,在上⾯的代码中,作为⽗对象的window会⾸先
被析构,因为它是最后⼀个创建的对象。在析构过程中,它会调⽤⼦对象列表中每⼀个对象的析构函
数,也就是说,quit此时就被析构了。然后,代码继续执⾏,在window析构之后,quit也会被析
构,因为quit也是⼀个局部变量,在超出作⽤域的时候当然也需要析构。但是,这时候已经是第⼆次
调⽤quit的析构函数了,C++不允许调⽤两次析构函数,因此,程序崩溃了。
由此我们看到,Qt的对象树机制虽然在⼀定程度上解决了内存问题,但是也引⼊了⼀些值得注意的事
情。这些细节在今后的开发过程中很可能时不时跳出来烦扰⼀下,所以,我们最好从开始就养成良好
习惯

相关文章:

【QT】:QT图形化界面概述

Qt背景介绍 1.1 什么是Qt Qt 是⼀个跨平台的C图形⽤⼾界⾯应⽤程序框架。它为应⽤程序开发者提供了建⽴艺术级图形 界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt为开发者提供了⼀种基于组件的开发模 式,开发者可以通过简单的拖拽和组合来实现…...

[论文笔记]Representation Learning with Contrastive Predictive Coding

引言 今天带来论文 Representation Learning with Contrastive Predictive Coding的笔记。 提出了一种通用的无监督学习方法从高维数据中提取有用表示,称为对比预测编码(Contrastive Predictive Coding,CPC)。使用了一种概率对比损失, 通过使用负采样使…...

Redis相关

Redis相关 什么是redis?redis可以干什么? Redis是一个c语言编写的nosql数据库(不仅仅是sql,泛指非关系型数据库,一般把非关系型数据库称为nosql数据库),数据在内存中以键值对的形式存储,读写速度快,提供数据持久化方式. 常常被广泛应用到做缓存 Redis使用场景 1.缓存 2…...

【优选算法】Binary-Blade:二分查找的算法刃(上)

文章目录 1.概念解析2.二分查找的简单模版3.二分查找的进阶模版4.x的平方根5.搜索插入位置希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 本篇是优选算法之二分查找算法,该算法是一种高效的在有序数组中查找特定元素的搜索算法 1.概…...

Docker--Docker Network(网络)

Docker Network(网络)是Docker容器之间和容器与外部网络之间的通信和连接的一种机制。以下是对Docker Network的详细解释: 一、Docker网络的重要性 Docker容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作…...

转化率是衡量网页设计的一个重要指标,请问如何做?

AARRR是互联网产品运营中一个非常重要的模型,这些模型的每一个步骤都涉及到转化率问题,那么AARRR是是什么呢?转化漏斗是什么吗?转化率为什么重要?设计师在做网页设计的时候,如何提升转化率呢?本…...

运维工具之syncthing工具的安装和使用

一、syncthing工具简介 Syncthing是一款开源的文件同步工具,采用Go语言编写。它支持在多个操作系统上运行,包括Windows、macOS和Linux,以及BSD、Solaris和Android等。以下是对这款软件的详细介绍,主要功能: 实时文件同…...

国产数据库-崖山使用介绍

本文档基于崖山数据库23.3 个人版本,单机(主备)部署模式的情况下的使用介绍。 数据库实例状态: NOMOUNT:仅读取参数文件,不加载数据库 MOUNT:读取控制文件,加载数据库&#xff…...

primevue的<Menu>组件

1.使用场景 2.代码 1.给你的menu组件起个引用名 2.<Menu>组件需要一个MenuItem[] 3.你要知道MenuItem[ ]的特殊的数据格式&#xff0c;就像TreeNode[ ]一样&#xff0c;数据格式不对是不渲染的。。。。 常用的属性就这几种&#xff0c;js语言和java不一样&#xff0c;J…...

【玩转23种Java设计模式】行为型模式篇:备忘录模式

软件设计模式&#xff08;Design pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...

便捷饭店点餐小程序的设计与实现ssm+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…...

微信小程序Uniapp

使用命令行创建项目&#xff08;vuets&#xff09; npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project然后用HBX打开项目 再安装依赖 npm i 再运行开发版本&#xff0c;生成dist目录 pnpm dev:mp-weixin 注意要设置APPid 再用微信小程序打开...

Android GameActivity(NativeActivity)读写文件

最近研究native android相关内容&#xff0c;其中最棘手的就是文件读写问题&#xff0c;最主要的是相关的文档很少。这里写下我所知道的方法。 由于本人使用的是Android14[arm64-v8a]版本的设备,能访问的路径相当有限&#xff0c;如果想要访问更多的路径&#xff0c;就不得不申…...

《计算机网络A》单选题-复习题库解析-2

目录 51、下列关于以太网网卡地址特点的说法中&#xff0c;不正确的是&#xff08; &#xff09;。 52、当一个Web Browser向一个使用标准服务器端口的Web Server提出请求时&#xff0c;那么在服务返回的响应包中&#xff0c;所使用的源端口是&#xff08; &#xff0…...

GPU 进阶笔记(二):华为昇腾 910B GPU

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; 1 术语 1.1 与 NVIDIA 术语对应关系1.2 缩写2 产品与机器 2.1 GPU 产品2.2 训练机器 底座 CPU功耗操作系统2.3 性能3 实探&#xff1a;鲲鹏底座 8*910B GPU 主机 3.1 CPU3.2 网卡和网络3.3 GPU 信息 3.3…...

如何利用 ClickHouse 实现高级分析:MySQL 到 ClickHouse 实时数据同步指南

在数据驱动的时代&#xff0c;企业必须依靠先进的数据分析能力来提升竞争力。随着数据量的激增和业务需求的复杂化&#xff0c;传统的关系型数据库已经无法满足高效处理和实时分析的需求。ClickHouse 作为一款高性能的列式数据库&#xff0c;凭借其卓越的查询性能和可扩展性&am…...

Python读取TIF文件

在Python中&#xff0c;逐帧读取TIFF文件&#xff08;尤其是多页TIFF文件&#xff09;可以使用tifffile库或Pillow库。以下是两种方法的示例&#xff1a; 方法 1&#xff1a;使用 tifffile 逐帧读取 tifffile 是一个专门用于处理TIFF文件的库&#xff0c;支持多页TIFF文件的逐…...

vue3+ts+element-plus 表单el-form取消回车默认提交

问题描述&#xff1a;在表单el-form中的el-input中按回车后&#xff0c;页面会刷新&#xff0c;url也会改变&#xff0c; 回车前&#xff1a; 回车后&#xff1a; 相关代码&#xff1a; 解决方法1&#xff1a;在 el-form 上阻止默认的 submit 事件&#xff0c;增加 submit.pre…...

面试经典150题——滑动窗口

文章目录 1、长度最小的子数组1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、无重复字符的最长子串2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、串联所有单词的子串3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、最小覆盖子串4.1 题目链接4.2 题目描…...

目标检测之DINO详解

相关链接 论文:[2203.03605] DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detectionhttps://arxiv.org/abs/2203.03605 代码:...

Linux指令

1. 将一个文件夹中的前5000张图片移动到另一个文件夹 可以使用 find 和 mv 命令来实现将一个文件夹 folder1 中的前 5000 张 jpg 图片移动到另一个文件夹 folder2。下面是具体的步骤&#xff1a; 首先&#xff0c;确保 folder2 存在。如果不存在&#xff0c;可以使用 mkdir 命…...

groovy:多线程 简单示例

在Groovy中&#xff0c;多线程编程与Java非常相似&#xff0c;因为Groovy运行在Java虚拟机&#xff08;JVM&#xff09;上&#xff0c;并且可以利用Java的所有并发工具。以下是一些在Groovy中实现多线程编程的方法&#xff1a; class MyThread extends Thread {Overridevoid…...

硬件产品:做产品,不仅仅是产品思维

目录 前言 1. 产品思维阶段 2. 流量思维阶段 3. 用户思维阶段 作者简介 前言 从思维层面来看&#xff0c; 做产品会经历三个阶段&#xff0c;分别是&#xff1a; 1. 产品思维阶段&#xff1b; 2. 流量思维阶段&#xff1b; 3. 用户思维阶段。 如果不理解这三个思维…...

【小程序开发】解决 HBuilder X 提示“本项目类型无法运行到小程序模拟器”

今天在hbuilder引入一个项目时&#xff0c;准备将该项目在微信开发者工具上运行时&#xff0c;发现提示“本项目类型”&#xff0c;如何解决这个问题&#xff1f; 问题如下&#xff1a; 第一&#xff1a;检查一下文件夹是否为一级文件夹&#xff08;如图&#xff09; 不要有多个…...

RuoYi-Vue从http升级为https(Jar+Nginx)

一、前提条件 1.已通过数字证书管理服务控制台签发证书。 2.SSL证书绑定的域名已完成DNS解析,即域名与主机IP地址相互映射。 附:阿里云网站运维检测平台 3.已在Web服务器开放443端口(HTTPS通信的标准端口)。 如果使用的是阿里云ECS服务器,请确保已经在安全组规则入方向…...

探索 Yocto-Meta-OpenEuler:嵌入式开发的强大基石

title: 探索 Yocto-Meta-OpenEuler&#xff1a;嵌入式开发的强大基石 date: ‘2024-11-19’ category: blog tags: Yocto-Meta-OpenEuler嵌入式系统开源项目定制化开发 sig: EmbeddedTech archives: ‘2024-12’ author:way_back summary: Yocto-Meta-OpenEuler 为嵌入式系统开…...

leetcode 3219. 切蛋糕的最小总开销 II

题目&#xff1a;3219. 切蛋糕的最小总开销 II - 力扣&#xff08;LeetCode&#xff09; 排序贪心。 开销越大的越早切。 注意m或n为1的情况。 class Solution { public:long long minimumCost(int m, int n, vector<int>& horizontalCut, vector<int>&…...

UniApp 打开文件工具,获取文件类型,判断文件类型

注意&#xff1a;以下代码使用 typeScript 开发&#xff0c;如果想在 js 中使用&#xff0c;可参考 npm 已经发布的包&#xff1a;https://www.npmjs.com/package/uni-easy-file NPM 使用 如果想直接在 npm 项目中使用可以直接执行以下命令 npm i uni-easy-file然后直接使用 …...

webpack打包node后端项目

webpack打包后端项目 后端项目写好了&#xff0c;感觉也可以打包一下&#xff0c;然后就想到了用webpack试试 先要下载webpack和webpack-cli npm install webpack webpack-cli然后创建webpack配置文件webpack.config.js 核心配置为entry、output、target 但是因为咱们是后…...

《学习之道》

《学习之道》主要讲述了以下内容&#xff1a; 学习的原理 大脑的两种认知模式&#xff1a;介绍了专注模式和发散模式。专注模式适合集中精力解决具体问题、进行深度理解和记忆推理&#xff0c;但长时间使用易疲惫和陷入思维定式&#xff1b;发散模式则让大脑在更广泛的认知网…...

随笔 | 写在2024的最后一天

. 前言 转眼又到了一年的末端。过去这一年&#xff0c;和前些年有些不同&#xff0c;变化巨大&#xff0c;感触良多。多到一时竟不知从何开始写。今天这篇随笔&#xff0c;因为时间有限&#xff0c;可能文法也会有些凌乱&#xff0c;就是想到哪里写到哪里&#xff0c;如果未来…...

对三层架构的梳理(Controller、Service、Dao)

项目结构如下&#xff1a; src├── main│ └── java│ └── com│ └── example│ └── demo│ ├── controller│ │ └── UserController.java│ ├…...

常用的公共 NTP(网络时间协议)服务器

公共 NTP 服务列表 以下是一些常用的公共 NTP&#xff08;网络时间协议&#xff09;服务器&#xff0c;供您参考&#xff1a; 中国地区公共 NTP 服务器 国家授时中心 NTP 服务器&#xff1a;ntp.ntsc.ac.cn中国 NTP 快速授时服务&#xff1a;cn.ntp.org.cn阿里云公共 NTP 服务…...

SimForge HSF 案例分享|复杂仿真应用定制——UAVSim无人机仿真APP(技术篇)

导读 「神工坊」核心技术——「SimForge HSF高性能数值模拟引擎」支持工程计算应用的快速开发、自动并行&#xff0c;以及多域耦合、AI求解加速&#xff0c;目前已实现航发整机数值模拟等多个系统级高保真数值模拟应用落地&#xff0c;支持10亿阶、100w核心量级的高效求解。其低…...

ROS2+OpenCV综合应用--10. AprilTag标签码追踪

1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上&#xff0c;增加了小车摄像头云台运动的功能&#xff0c;摄像头会保持标签码在视觉中间而运动&#xff0c;根据这一特性&#xff0c;从而实现标签码追踪功能。 2. 启动 2.1 程序启动前的准备 本次apriltag标签码使…...

Qanything 2.0源码解析系列6 PDF解析逻辑

Qanything 2.0源码解析系列6: PDF解析逻辑 type: Post status: Published date: 2024/12/04 summary: 深入剖析Qanything是如何拆解PDF的,核心是pdf转markdown category: 技术分享 原文:www.feifeixu.top 😀 前言: 在前面的文章中探究了图片是怎么进行解析的,这篇文章对…...

IDEA修改编译版本

目录 一、序言 二、修改maven配置 1.修改 2.代码 三、pom文件配置 1.修改 2.代码 3.问题 一、序言 有两种方法可以帮助大家解决IDEA每次刷新maven的pom配置时&#xff0c;会发生发行源版本不正常的报错。个人推荐第二种&#xff0c;原因&#xff1a;第二种你刷新maven后…...

Python 向量检索库Faiss使用

Faiss&#xff08;Facebook AI Similarity Search&#xff09;是一个由 Facebook AI Research 开发的库&#xff0c;它专门用于高效地搜索和聚类大量向量。Faiss 能够在几毫秒内搜索数亿个向量&#xff0c;这使得它非常适合于实现近似最近邻&#xff08;ANN&#xff09;搜索&am…...

LunarVim安装

LunarVim以其丰富的功能和灵活的定制性&#xff0c;迅速在Nvim用户中流行开来。它不仅提供了一套完善的默认配置&#xff0c;还允许用户根据自己的需求进行深度定制。无论是自动补全、内置终端、文件浏览器&#xff0c;还是模糊查找、LSP支持、代码检测、格式化和调试&#xff…...

机器学习随机森林回归时间序列预模型中时间滑动窗口作用以及参数设置

一、时间序列模型中时间滑动窗口作用 在时间序列模型中&#xff0c;时间滑动窗口&#xff08;Sliding Window&#xff09;起到了至关重要的作用。它是一种常见且有效的数据表示技术&#xff0c;通过将时间序列数据分割成多个固定大小的窗口&#xff0c;来捕捉和分析数据中的模式…...

【ArcGIS技巧】如何制作轨迹动画

轨迹是日常生活与工作经常要用到的&#xff0c;如跑步轨迹、自驾路线&#xff0c;考察轨迹等。地图根据路线生成轨迹也很好玩&#xff0c;今天小编就带大家用arcmap来实现这一功能&#xff0c;让你的制图动起来。 1、数据准备 在开始制作轨迹动画之前&#xff0c;准备一张影像…...

使用 Docker 搭建 Hadoop 集群

1.1. 启用 WSL 与虚拟机平台 1.1.1. 启用功能 启用 WSL并使用 Moba 连接-CSDN博客 1.2 安装 Docker Desktop 最新版本链接&#xff1a;Docker Desktop: The #1 Containerization Tool for Developers | Docker 指定版本链接&#xff1a;Docker Desktop release notes | Do…...

Bash 中的 2>1 | tee 命令详解

Bash 中的 2>&1 | tee 命令详解 在 Linux 和 Unix 系统中&#xff0c;命令行提供了强大的输出控制功能&#xff0c;能够灵活地处理标准输入&#xff08;stdin&#xff09;、标准输出&#xff08;stdout&#xff09;和标准错误&#xff08;stderr&#xff09;。本文将详…...

hpcrunner

title: 探索 Hpcrunner&#xff1a;高性能计算的得力助手 date: ‘2024-12-31’ category: blog tags: Hpcrunner高性能计算任务调度资源优化 sig: HPC archives: ‘2024-12’ author:way_back summary: Hpcrunner 作为高性能计算领域的一款实用工具&#xff0c;专注于优化任务…...

关于 PPPOE技术的详细解释

PPPoE&#xff08;以太网点对点协议&#xff09;是一种网络协议&#xff0c;它通过光纤将点对点协议&#xff08;PPP&#xff09;封装以实现宽带接入点。PPPoE主要用于ADSL和光纤等宽带接入技术中&#xff0c;它允许多个用户共享同一个交换机连接&#xff0c;同时为每个用户提供…...

java下载文件流,不生成中间文件。

java下载文件流&#xff0c;不生成中间文件。 代码设计&#xff1a;代码实现 代码设计&#xff1a; 从前端获取的数据经过后端加工后&#xff0c;生成文件流&#xff0c;并返回前端&#xff0c;&#xff08;不生成中间文件&#xff0c;注意内存&#xff0c;记得关闭流&#xf…...

Android:bug记录(简单)

1、theme 冲突 问题&#xff1a; java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.demokotlinapplication/com.example.demokotlinapplication.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (…...

【模块系列】STM321.69TFT屏幕

前言 在翻翻自己的器件盒的时候&#xff0c;发现这块好久之前买的TFT屏了&#xff0c;想起还没有用STM32点亮过&#xff0c;手头上正好有立创的梁山派STM32F4&#xff0c;就试着按照网上的文章教程顺便移植个LVGL看看&#xff0c;然后就有了就本文。 代码工程命名的是LvglDemo&…...

机器学习详解(11):分类任务的模型评估标准

模型评估是利用不同的评估指标来了解机器学习模型的性能&#xff0c;以及其优势和劣势的过程。评估对于确保机器学习模型的可靠性、泛化能力以及在新数据上的准确预测能力至关重要。 文章目录 1 介绍2 评估准则3 分类指标3.1 准确率 (Accuracy)3.2 精确率 (Precision)3.3 召回率…...

UE5材质节点Camera Vector/Reflection Vector

Camera Vector相机向量&#xff0c;输出像素到相机的方向&#xff0c;结果归一化 会随着相机移动而改变 Reflection Vector 反射向量&#xff0c;物体表面法线反射到相机的方向&#xff0c;x和y和camera vector相反 配合hdr使用...