目录
Qt 是什么
Qt 与 Qt Creator 的关系
暗黑主题音乐播放器界面 UI 设计。
简约的视频界面设计。
炫酷车载音乐 APP 主界面开发。
Qt/C++与 QML
如何选择 Qt 版本
Linux 下安装 Qt
配置中文输入法
Qt Creator 简单使用
第一个 Qt 程序
新建一个项目
编辑 项目文件介绍
项目文件*.pro
样式文件*.ui
头文件*.h
源文件*.cpp
Qt 是什么
Qt
是一个跨平台的
C++
开发库。主要用来开发图形用户界面(
Graphical User Interface
,简
称
GUI
)程序。
Qt
虽然经常被当做一个
GUI
库,用来开发图形界面应用程序,但这并不是
Qt
的全部;
Qt
除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、
访问数据库、图像处理、音频视频处理、网络通信、文件操作等,这些
Qt
都已经内置了。
Qt
还存在
Python
、
Ruby
、
Perl
等脚本语言的绑定, 也就是说可以使用脚本语言开发基
于
Qt
的程序。开源社区就是这样,好东西就会被派生扩展,到处使用,越来越壮大。
Qt
支持的操作系统有很多,例如通用操作系统
Windows
、
Linux
、
Unix
,智能手机系统
Android
、
iOS
、
WinPhone
, 嵌入式系统
QNX
、
VxWorks
等等。
简单的来说,
Qt
可以做很多东西,好比如
Windows
下的软件也有很多是
Qt
开发的,这里
我很喜欢它的一个特性就是跨平台使用,“跨平台”代表一份代码可以无需任何修改或者小修改
就可以在其他平台上运行。
Qt 与 Qt Creator 的关系
Qt
能做什么
Qt
能做什么?理论上来说,您能想到的
App
,
Qt
它都基本能做。像
WPS
这种大型的桌面
应用,
Maya(3D
建模
)
,一些游戏的内核都可以使用
Qt
来实现。甚至您能快速使用
Qt
来开发一
款像酷狗,网易云音乐这样的音乐播放器。在嵌入式里,使用
Qt
来开发界面已经是无可替代的
一种趋势。工控界面最常用,一些移动端的界面也开始使用
Qt
。像点菜机,温度采集数据显示,
汽车仪表,速度显示界面等。
Qt
能做优美的界面,所以推出了
QML
(一种描述性的语言)。每
次
Qt
更新都有在
Quick
(
QML
使用的模块)上优化或者添加功能,看来
Qt
打算在移动设备端
的开发市场端进军!呵呵,其实
Qt
早已经在这块发展了!
下面是本书开发的一些界面小例子,请欣赏。要想开发好的界面关键是要有想法。可以说
如果您是做界面其实大多数时间花在美化界面上,功能都是比较容易实现的。最好读者需要有
一定的美工基础,例如会基本的
PS
,在开发过程中就不用去麻烦公司的美工了,开发界面和程
序一起做。
暗黑主题音乐播放器界面 UI 设计。
简约的视频界面设计。
炫酷车载音乐 APP 主界面开发。
Qt/C++与 QML
QML
是
Qt C++
基础上拓展的。也就是说
Qt C++
上所使用界面的类,基本都是可以拓展到
QML
上。如果不能拓展的,也可以直接
QML
与
C++
一起使用。实际上
Qt C++
效率更高。所
以本教程都是
Qt C++
为基础做教程入门教程,
QML
可以说是一个加分项。
Qt QML
模块提供
QML
语言开发应用程序和库提供了一个框架。
QML
本身不涉及显示部分的内容,所以
Qt Quick
模块充当了这部分的作用。至于他们三者的关系,我们就这样简单的了解一下就行了。
Qt C++
在底层编写功能更突出,若要做好看的界面且功能强大,
Qt C++
与
QML
语言结合
是必不可少的。
QML
语言负责界面层,而底层调用
Qt C++
。比如文件的读写、图像处理、多
线程通信等这些都是需要
C++
来编写完成的。
在目前来说,
Qt C++
更成熟,
QML
目前也比较成熟了,因为每次更新版本
QML
也有更新。
不过在低版本的
Qt
(如
Qt5.6
以下),
QML
还不够成熟,
QML
在高版本的
Qt
(如
Qt5.7
以上)
更成熟。
C++
依旧是
Qt
的主要编程语言,
Qt 5
也并没有忽略它,
Qt 5
添加了很多新的
C++ API
,
而且会持续更新。引入
QML
应该是
Qt
向移动端市场的一个突破,还有
python
和
javascript
都
可以在
Qt
里用。
说了
C++
又说
QML
,但是
Qt
基础教程还是主打
Qt C++
,有了基础学
Qt
里其他的东西就
不难!
如何选择 Qt 版本
初学者应该要如何选择
Qt
的版本?截至
2020
年最新的
Qt5
版本是
Qt5.15
。可以参考这个
网址
https://doc.qt.io/qt-5/qt5-intro.html
来看看各个
Qt
版本的更新说明。
Qt6
已经出了,我们有
必要直接上最新版本的
Qt6
吗?不!
Qt6
理论上与
Qt5
能兼容,但是许多公司在用
Qt5
甚至
Qt
4
。学习了
Qt5
,
Qt6
等稳定版本出来,等市场上用的多,我们用
Qt6
才是最明智的选择,新出
的事物往往要有一定的时间去适应!我们主要是简单对整个
Qt
版本说明一下。首先,
Qt
版本
的升级肯定是对上一版本进行优化。比如
Qt4
与
Qt5
的的语法区别,
Qt5
的信号槽写法与
Qt4
的信号槽写法有区别。除了
Qt5.10
以上的版本,
Qt5.6
与
Qt5.9
是
Qt
长期支持的版本
LTS
(
Lo
ng Term Support
,简称
LTS
)。但是
2020
年
3
月最近
Qt
官方将
Q5.2~Qt5.8
、
Qt5.11
归档到
htt
p://download.qt.io/new_archive/qt/
。所以很多小伙伴们想用老版本的
Qt
要到上面这个链接去下
载了。毕竟有些时候我们开发板程序处于某个
Qt
版本下开发的,如果要迁移到新版本的
Qt
可
能还要考虑到兼容问题!不过变化不会很大的,请放心!
下面贴出
Qt
官方下载链接
http://download.qt.io/archive/qt/
。我们直接进入这个链接可以看
到下图。下图和上图加起来才是
Qt
的完整版本。那么多版本任君选择。还可以看到
Qt
版本在
不断的更新,更多的功能将会注入到
Qt
这个
GUI
库里,使我们开发变得更简单和有趣!
理论上我们选择
Qt
的版本越新越好,这是当然的,不过我们还是要确定一个版本是必须的,
因为日后写好的程序要长期运行在一个确定的版本里,避免随意升级带来其他兼容性问题,或
者重复重复移植等工作。
Linux 下安装 Qt
同样地,进入
http://download.qt.io/archive/qt/5.12/5.12.9/
下载页面(注意如果找不到下载链
接,我们就进行
http://download.qt.io
这个顶层目录一个个目录找,因为
Qt
下载链接会变动),
选择
Linux
的安装包下载。使用迅雷下载再拷贝过去
Ubuntu
虚拟机或者直接复制链接地址到
Ubuntu
虚拟机下载。
如 下 图 , 复 制 链 接 下 载 地 址 到
Ubuntu
虚 拟 机 终 端 下 使 用 指 令
wget
下载,
http://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run
。
wget http://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run
一般我们用第二种方法通过Windows下载用ftp软件传入到ubantu里面
赋予可执行权限,加上 sudo 权限进入安装,这样会安装在/opt 目录下。
chmod +x qt-opensource-linux-x64-5.12.9.runsudo ./qt-opensource-linux-x64-5.12.9.run
执行安装指令后,将会弹出 Qt 的安装界面。
安装完成,在左下角应用程序中心找到 Qt Creator,点击打开 Qt Creator。
打开 Qt Creator 的界面如下,安装完成。
配置 Qt Creator 输入中文
配置
Ubuntu
中文环境
Ubuntu
的默认安装环境是使用的语言是英文,很多同学不习惯。现在我们将
Ubuntu
的系
统语言设置成中文。在
Ubuntu
右上角,点击设置图标如下图第①步。
按如下图设置,点击(
install/Remove Languages …
)安装或者移除语言,在安装语言处选
择简体中文,点击
Apply
应用即可。
配置完成后,点击重启(或者注销
Ubuntu
),重启后,因为我们已经更新了系统的语言,
Ubuntu
询问我们需不需要将系统文件夹的名称也改成中文。这里作者选择否,保留旧的名称。
保留旧的名称有一定的好处,就是我们进入这些访目录时,直接使用英文,不用切换到中文输
入法。严格来说,最好是统一用英文环境开发了。这里为了初学者或者有强迫中文者,所以我
们这里需要配置中文的环境,及后期开发
Qt
需要写中文注释,方便理解与给后人看。
配置中文输入法
在上面我们已经配置好中文环境,并有拼音输入法
ibus
,但
ibus
并不好用,
Qt Creator
不
支持
ibus
输入中文。好的生产工具决定好的生产力,下面我们介绍一下
Fcitx
输入法。
Fcitx (Flexible Input Method Framework)
──即小企鹅输入法,它是一个以
GPL
方式发布
的输入法平台,可以通过安装引擎支持多种输入法,支持简入繁出,是在
Linux
操作系统中常
用的中文输入法。它的优点是:短小精悍、跟程序的兼容性比较好。
Fcitx
内置的输入法支持中文 拼音 和基于字符表的输入
(
例如五笔
)
,根据语言的不同,有
不同的输入法引擎可以选择。
在
Fcitx
支持的拼音输入法中,内置拼音响应速度最快。
Fcitx
同样支持流行的第三方拼
音输入法以提供更好的整句输入效果
.
fcitx-sunpinyin
在输入速度和输入精度之间有较好的平衡。
fcitx-libpinyin
算法比
sunpinyin
先进。
fcitx-rime,
即著名中文输入法
Rime IME
的
Fcitx
版本。但它不支持
Fcitx
本身的
#
特殊符
号和
#
快速输入功能,自定义设置请参见官方(
http://rime.im/
)。
fcitx-googlepinyin, Google
拼音输入法
for Android.
fcitx-sogoupinyin
(
AUR
,) 搜狗输入法
for linux
—支持全拼、简拼、模糊音、云输入、皮
肤、中英混输入。官方网址(
http://pinyin.sogou.com/linux/
)。
fcitx-cloudpinyin
可以提供云拼音输入的支持,支持
Fcitx
下的所有拼音输入法,
Fcitx-rime
除外。
fcitx-chewing
为
Fcitx
添加
chewing (
繁体中文注音
)
输入引擎支持。依赖
libchewing
。
fcitx-table-extra adds Cangjie
,
Zhengma
,
Boshiamy support
。
sudo apt-get install fcitx-sunpinyin// 拼音输入法请装 sunpinyin 或者 fcitx-googlepinyin
也可以安装搜狗或者系统自带的 记得配置fcitx就行
再到右上角点击系统设置,找到语言支持,将键盘输入方式系统点击下拉复选框选择为
fcitx
,
然后点击应用到整个系统,再关闭。如下图步骤
为了确保刚配置的环境生效,完成以上步骤后重启 Ubuntu 系统。
Qt Creator 简单使用
Qt Creator
界面组成
启动
Qt Creator
后,
Qt Creator
的主界面如下图,默认打开的是欢迎页面。可以看到
Qt Creator
里自带很多示例。在
Ubuntu
里,由于
Qt Creator
安装在
/opt
目录下,这个目录普通用户是没有
权限写的,只能够读。如果要打开示例先点击后选择“复制项目并打开”。作者比较喜欢
Qt Creator
界面设计的。十分简洁,还自带示例,不会写也会参考!最重要的是
Qt Creator
里
左侧栏
的“帮
助”按钮,有很多使用说明,总结的非常好,对学习
Qt
的类有很大帮助,如果学习到某个方法
或者类不会用,可以打开这个“帮助”来搜索这个类或者方法的用法。没有任何一本教程能有
Qt
帮助文档这么详细了,可惜是英文的,初学者学起来还是会一定难度。多多参考这个
Qt
帮
助文档,因为那里能学到很多,例子说明也特别多,每个方法、类、信号与槽等都有详细的解
释
单击
顶部
工具栏的“帮助”菜单,点击“
UI Tour
”会出现介绍
Qt Creator
各组件的说明。
这个大家一定要看看,虽然是英文的说明,但是大体有个了解。这里就不再截图说明了。后面
编写第一个
Qt
程序也会说明整个项目编写及编译运行的流程。界面组成我们只需要了解这么多。
第一个 Qt 程序
“
hello world
”的起源要追溯到
1972
年,贝尔实验室著名研究员
Brian Kernighan
在撰写
“
B
语言教程与指导
(Tutorial Introduction to the Language B)
”时初次使用(程序),这是目前已
知最早的在计算机著作中将
hello
和
world
一起使用的记录。第一个程序都是以“
hello,world
”
作为默认的第一个程序,我们延续这种经典的做法吧,感受程序的伟大。同时可以让我们初步
了解
Qt
项目搭建的基础流程。
新建一个项目
在
Ubuntu18
里打开
Qt Creator
,也就是左下角软件中心处点击后,找到
Qt Creator
的图标
后点击打开。单击文件
Qt Creator
的文件,选择新建文件或者项目。注意有快捷键
Ctrl + N
。直
接在
Qt Creator
激活状态和英文状态的输入法下使用“
Ctrl + N
”也可以快速打开新建项目。
弹出的新建项目如下图,这里我们可以看到有很多模板(包括项目模板和文件和类模板)
可以使用,包括
Qt
,
Qt Quick
,
Qt for Python
,
…
,
C++
等等。作为初学者我们选择第一个
Application(Qt)
和
Qt Widgets Application
,所谓的模板就是
Qt
为了方便开发程序,在新建工程
时可以让用户基于一种模板来编写程序,包括
cpp
文件,
ui
文件都已经快速的创建,而不用用
户手动创建这些文件。这样对用户的开发带来极大的便捷。当然用户可以可以自己手动创建项
目,一个一个往里面加也是可以的。但是初学者不建议这么做,我们的目的是先体验一遍项目
搭建的流程,等日后有空再自己回头尝试这么做吧!
如果您的输入法现在处于中文输入法,先按
Ctrl
再按
Space
(空格)切换成英文输入法,
在名称处输入项目为“
01_hello_world
”,这里的项目路径为笔者个人的家目录路径下的
Qt
目录
下,勾选设为默认的项目路径,这样以后做项目实验时都是默认选择这个目录作为项目路径而
不用自己手动选择路径了。选择下一步。
默认已经是选择
qmake
编译,主要用
qmake
生成
Makefile
用于项目的编译。点击下一步即
可。
这里默认选择的基类为
QMainWindow
。在
Base class
一项中我们还可以看到还有
QWidget
和
QWialog
这样的基类可以选择。在
C++
篇我们已经学习什么叫基类,简单的来说,我们创建
的这个项目是基于
QMainWindow
类去开发的。默认勾选“
Generate form
”,意思是生成
ui
窗体
文件
mainwindow.ui
。为了学习方便,我们统一默认基类为
QMainWindow
,但是注意,在嵌入
式里一般不需要标题栏,状态栏等,所以常用的是
QWidget
基类。
- QMainWindow:主窗口类,主窗口具有主菜单栏、工具栏和状态栏。类似于一般的应用程序的主窗口。如果您想做个嵌套的窗口程序开发的软件,不妨选择这个 QMainWindow。
- QWidget:是可视界面类的基类,也就是说QMainWindow类也是由QWidget继承封装而来。 所以 QWidget 要比 QMainWindow 功能少一些。
- QDialog:对话框类,建立一个对话框界面。比较少使用此项作为基类。一般以 QMainWindow 和 QWidget 作为基类的居多。注因为 QWidget 不带窗口标题栏等,嵌入式里最好 QWidget。
在高版本的
Qt Creator
里,有
Translation
这一项,
Qt
提供了一个(
.ts
)的文件给您,
.ts
是
可读的翻译文件,使用简单的
XML
格式。我们暂时只需要知道这个东西是个可读的翻译文件
即可。极少需要使用到。点击下一步。
。。。。,一键点下一步就行
新建的“01_hello_world”项目如下。
项目文件介绍
其中,左侧有上下两个子窗口,上面的窗口显示了项目的文件结构,显示当前的项目为
“
01_hello_world
”,细心的还会发现“
01_hello_world
”是用粗体黑色标明。说明此项目是活动
项目,活动项目的项目根节点都是用粗体字体表示的。如果打开了多个项目,那么我们只需要
观察哪个是加粗的项目名就表示当前活动项目。
Qt Creator
和其他
IDE
开发软件一样。都是分组管理项目内的各种源文件,下面是项目内
的文件简介。
- 01_hello_world.pro 是项目管理文件,这个项目管理文件十分重要,当您加入了文件或者删除了文件,Qt Creator 会自动修改这个*.pro 文件。有时候需要打开这个*.pro 文件添加我们的设置项。
- Header 分组,这个节点下存放的是项目内所有的头文件*.h。
- Source 分组,这个节点下存放的是项目内的所有 C++源码文件*.cpp。
- Forms 分组,这个节点下是存放项目内所有界面文件*.ui。*.ui 文件由 XML 语言描述组成, 编译时会生成相应的 cpp 文件,这样交叉编译器就可以编译它了。
项目文件*.pro
01_hello_world.pro
文件如下所示。此
pro
文件在高版本的
Qt
与低版本的
Qt
文件有些区别,
且在
Windows
与
Linux
系统下生成的
pro
也有些区别,但是变化不大。
01_hello_world.pro
文件内容
QT += core gui
//添加了 Qt 的支持的模块,core 与 gui 库是 Qt 的默认设置。
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
//比较 Qt5 版本,如果是 Qt5 版本,在 main.cpp 中 application 是在 QtWidgets 中的,
因此要包含这个库。
CONFIG += c++11
//分别配置的是使用 c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
//添加 QT_DEPRECATED_WARNINGS 定义。
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
//SOURCES 下的是源文件。
SOURCES += \
main.cpp \
mywidget.cpp \
widget.cpp
//HEADERS 下是头文件。
HEADERS += \
mywidget.h \
widget.h //FORMS 下是 ui 界面文件。
# Default rules for deployment.//部署默认的规则。
qnx: target.path = /tmp/$${TARGET}/bin //qnx:判断是不是 qnx 操作系统,赋值
else: unix:!android: target.path = /opt/$${TARGET}/bin target.path = /temp/$${TARGET}/bin。
//如果是 unix 系统但不是安卓,赋值 target.path = /opt/$${TARGET}/bin。
!isEmpty(target.path): INSTALLS += target//如果 target.path 为空目录,赋值 INSTALLS += target。
如果需要修改生成目标的可执行程序名字,可赋值 TARGET = xxx。否则 TARGET 将默认
取值为项目的名字。
样式文件*.ui
mainwindow.ui
是一个
xml
类型的文件,它的
xml
内容如下。这个文件是生成的不能手动
编辑。只能够通过图形界面修改其属性。
双击
mainwindow.ui
后可以跳转到设计界面,如下图。下面主要介绍主体部分。
1.
①是控件栏,有各种各样的控件,上方的
Filter
是过滤器,输入首写字母就可以快速定到
我们想要找的控件。
2.
②显示的是我们的窗口程序了,上面已经带有
MainWindow
对象及其几个子对象,默认
MainWindow
就带有菜单栏和状态栏。
3.
③是对象栏,②处用到的对象都在③处显示。
4.
④是属性栏,点击③处对象栏的某个对象,就可以在④属性栏里编辑它的属性了。属性项
有很多,包括位置,大小,文字,颜色,字体等等。
头文件*.h
点击左边栏的编辑,回到项目的编辑工作窗口。点击项目下的
Headers
下的
mainwindow.h
,
mainwindow.h
一般有与之对应的一个
cpp
文件叫
mianwindow.cpp
。其中
mainwindow.h
包含类
的声明,
mianwindow.cpp
包含类的实现。这与我们前面学习的
c++
是一样的。
mainwindow.h
的内容如下。
mianwindow.h 定义如下
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5
6 QT_BEGIN_NAMESPACE
7 namespace Ui { class MainWindow; }
8 QT_END_NAMESPACE
9
10 class MainWindow : public QMainWindow
11 {
12 Q_OBJECT
13
14 public:
15 MainWindow(QWidget *parent = nullptr);
16 ~MainWindow();
17
18 private:
19 Ui::MainWindow *ui;
20 };
21 #endif // MAINWINDOW_
第
7
行,定义名称空间
Ui
,里面有一个类
MainWindow
,这个
MainWindow
和第
10
行里
的
MainWindow
不是同一个对象。实际上,这个文件里的
MainWindow
类有一个成员
*ui
就是
指向第
19
行的
Ui::MainWindow
的指针。这都是为了使用
.ui
文件设计界面的。
第
12
行,
MainWindow
的声明中第一行是
Q_OBJECT
,这是一个宏,由
Qt
进行处理,这
也是
Qt
针对
C++
扩展的地方,所有用到信号的类都要加这个宏。
源文件*.cpp
点击项目下的
Sources
下的
mainwindow.cpp
。可以看到它的内容如下。
1 #include "mainwindow.h"
2 #include "ui_mainwindow.h"
3
4 MainWindow::MainWindow(QWidget *parent)
5 : QMainWindow(parent)
6 , ui(new Ui::MainWindow)
7 {
8 ui->setupUi(this);
9 }
10
11 MainWindow::~MainWindow()
12 {
13 delete ui;
14 }
第
2
行,
MainWindow
的实现类中,第
2
行
include
了一个文件
ui_mainwindow.h
这个文件
是
Qt
根据
.ui
文件自动生成的,也就是说
ui_mainwindow.h
要点击编构建后才生成,我们才能看
到这个文件。构建
/
编译后可以在
debug/release
的目录找到这个文件。
第
6
行,在
MainWindow
构造函数中用“
,
”隔开,
new
一个
Ui
中的
MainWindow
。这里
是一种初始化成员的方法。
第
8
行,
ui->setupUi(this);
这句话是进行界面初始化,将
this
(指的是
MainWindow
类的本
身),作为参数传到
setupUi
里,
ui
界面文件的对象会以
this
为父对象,所有子对象都将显示在
MainWindow
里。我们要想使用
ui
里的对象,必须将代码写在
ui->setupUi(this)
这句话之后,因
为
ui->setupUi(this)
会先初始化里面的对象,只有初始化里面的对象我们才能使用这个对象。
第
13
行,析构函数里
delete
掉
ui
。在
Qt
里我们需要在析构函数里
delete
的对象一般是
new
创建的并且没有父对象的对象。
小提示:
this
在成员函数的开始执行前构造的,在成员的执行结束后清除。
点击项目下的
Sources
下的
main.cpp
。可以看到它的内容如下。
1 #include "mainwindow.h"
2
3 #include <QApplication>
4
5 int main(int argc, char *argv[])
6 {
7 QApplication a(argc, argv);
8 MainWindow w;
9 w.show();
10 return a.exec();
11 }
第
3
行,包含
QApplication
类的定义。在每一个使用
Qt
的应用程序中都必须使用一个
QApplication
对象。
QApplication
管理了各种各样的应用程序的广泛资源,比如默认的字体和光
标。
第
5
行,
main()
函数是程序的入口。几乎在使用
Qt
的所有情况下,
main()
只需要在把控制
转交给
Qt
库之前执行一些初始化,然后
Qt
库通过事件来向程序告知用户的行为。
argc
是命令
行变量的数量,
argv
是命令行变量的数组。
第
7
行,
a
是这个程序的
QApplication
。它在这里被创建并且处理这些命令行变量。
第
8
行,创建一个对象
w
,这个对象就是
MainWindow
。
第
9
行,调用方法
show()
。这样程序界面才能显示。
第
10
行,这里就是
main()
把控制转交给
Qt
,并且当应用程序退出的时候
exec()
就会返回。
在
exec()
中,
Qt
接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。