目录第一章 Qt 概述Qt 简介2. 搭建 Qt 开发环境2.1 Qt 的开发工具概述2.2 Qt SDK 的下载和安装2.2.1 Qt SDK 的下载2.2.2 Qt SDK 的安装2.3 验证 Qt SDK 安装是否成功2.4 Qt 环境变量配置3.1 Qt Creator 概览3.2 使用 Qt Creator 新建项目3.2.1 新建项目3.2.2 选择项目模板3.2.3 选择项目路径3.2.4 选择构建系统3.2.5 填写类信息设置界面3.2.6 选择语言和翻译文件3.2.7 选择 Qt 套件3.2.8 选择版本控制系统3.2.9 最终效果3.3 认识 Qt Creator 界面3.3.1 左边栏3.3.2 代码编辑区3.3.3 UI设计界面3.3.4 构建区4.Qt Hello World 程序4.1 使用 按钮 实现4.1.1 纯代码方式实现4.1.2 可视化操作实现4.2 使用 标签 实现4.2.1 纯代码方式实现4.2.2 可视化操作实现5. 项目文件解析5.1 .pro 文件解析5.2 widget.h 文件解析5.3 main.cpp 文件解析5.4 widget.cpp 文件解析5.5 widget.ui 文件解析6. Qt 编程注意事项6.1 Qt 中的命名规范6.2 Qt Creator 中的快捷键6.3 使用帮助文档6.4 认识对象模型对象树6.5 Qt 窗口坐标体系第一章 Qt 概述Qt 简介Qt 是一个跨平台的 C 图形用户界面应用程序框架常用于开发桌面应用、嵌入式界面和一些跨平台工具。对qt背景感兴趣的自己百度哈我这勒一笔带过了主要重点先放在环境搭建、Qt Creator 的基本使用以及第一个窗口程序的运行流程上。2. 搭建 Qt 开发环境2.1 Qt 的开发工具概述Qt 支持多种开发工具常见的有 Qt Creator、Visual Studio、Eclipse。入门阶段建议直接使用Qt Creator因为它和 Qt 框架集成度最高创建项目、设计界面、编译运行、调试都比较方便。Qt CreatorQt 官方 IDE适合 Qt 项目开发支持代码编辑、界面设计、项目构建、调试、帮助文档等功能。Visual Studio微软 IDE也可以配置 Qt 开发环境但整体更偏通用 C/Windows 开发。Eclipse跨平台 IDE可以通过插件支持 C/C 和 Qt 开发但 Qt 入门阶段一般不优先选择。提示后续示例主要使用 Qt Creator 开发 Qt 程序。2.2 Qt SDK 的下载和安装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.23、选择Windows 桌面应用程序2.2.2 Qt SDK 的安装1、找到下载的文件并双击注意在双击之前先断网否则需要我们注册 Qt 账号登录后才能进入下一步安装2、双击之后进入如下界面3、选择安装路径时不能出现中文路径否则即使安装上也无法使用4、选择安装组件这里我们安装的是 Qt Creator。如果电脑磁盘空间允许建议全选以便后续使用如果空间不允许请看第5步5、选择部分组件说明其他未安装的组件在使用时可以另行添加6、后面一路同意安装就行了后面的几个安装界面懒得搞了都看得懂。2.3 验证 Qt SDK 安装是否成功1、双击打开 Qt Creator 工具并进入到 “欢迎模式” 下的 “示例” 界面2、在 “示例” 中任选其中一个单击打开该示例。在单击之后会弹出一个窗口关闭即可如果能构建并运行说明安装无误。运行结果如下图2.4 Qt 环境变量配置1、找到Qt的安装路径复制 “bin” 路径2、“此电脑” ------ 鼠标右键 “属性” ------ “高级系统设置” ------ “环境变量”3、“新建” ------ 填入 “bin” 路径 ------ “确定” ;4、注意在关掉所有窗口时一定要点击 “确定” 否则上述配置无效。提示为什么要设置环境变量环境变量是在操作系统中一个具有特定名字的对象它包含了一个或者多个应用程序将要使用到的信息。例如Windows 和 DOS 操作系统中的 path 环境变量当要求系统运行一个程序而没有告诉它程序所在的完整路径时系统除了在当前目录下面寻找此程序外还会到 path 中指定的路径去找。在 Windows 上设置 Qt 的环境变量是为了能够在命令行或其他应用程序中直接访问 Qt 相关的命令和工具。**认识 Qt Creator3.1 Qt Creator 概览从 开始菜单 或者 快捷方式 打开 Qt Creator 集成开发环境启动之后看到类似下面的界面①菜单栏。菜单栏一共有 8 个菜单选项包含了常用的功能菜单菜单项说明文件包含新建、打开、关闭项目和文件、打印、退出等基本功能。编辑包含撤销、剪切、复制、查找、选择编码等功能。构建包含构建和运行项目等相关功能。调试包含调试运行项目等相关功能。Analyze包含 QML 分析器、Valgrind 内存和功能分析器等相关功能。工具包含快速定位、外部工具以及 Qt Creator 各项配置入口。控件包含窗口布局相关功能例如全屏显示、隐藏边栏等。帮助包含 Qt 帮助、Qt Creator 版本信息、报告 bug、插件管理等功能。② 模式选择Qt Creator 左侧提供多个工作模式。模式说明欢迎模式提供打开项目、新建项目、查看示例、查看教程等快捷入口。编辑模式用于查看和编辑代码支持语法高亮、代码补全、函数跳转、帮助文档等功能。设计模式集成 Qt Designer可视化设计界面、设置控件属性、调整布局、编辑信号与槽。调试模式支持断点、单步调试、变量查看、线程查看等调试功能。项目模式用于配置构建设置、运行设置、编辑器设置、代码风格和依赖关系。帮助模式集成 Qt Assistant可以查看 Qt 和 Qt Creator 的相关文档。③ 构建套件选择器包含目标选择器、运行按钮、调试按钮和构建按钮。按钮/区域说明目标选择器选择要构建的项目、Qt 库、Debug/Release 类型等。运行按钮构建并运行当前项目。调试按钮以调试模式运行当前项目。构建按钮只构建项目不运行程序。④ 欢迎模式入口入口说明Project新建工程、打开工程。示例Qt 官方示例。教程Qt 官方教程。⑤ 定位器用于快速定位项目、文件、类、方法、帮助文档和文件系统。⑥ 输出窗格常用输出窗口如下。输出窗口说明问题显示编译错误和警告。Search Results显示搜索结果。应用程序输出显示程序运行时输出的信息。编译输出显示编译过程中的详细输出。Debugger Console显示调试器相关输出。概要信息显示运行或构建概要。Test Results显示测试结果。⑦ 会话记录用于管理 Qt Creator 的会话。⑧ 新建项目快速创建新项目。⑨ 打开已有项目快速打开已有项目。3.2 使用 Qt Creator 新建项目3.2.1 新建项目打开 Qt Creator 在菜单栏中选中“文件” -------- “新建文件或项目” 或者使用快捷键Ctrl n或者直接点击“new”在欢迎模式下直接点击 New如下图示3.2.2 选择项目模板弹出如下对话框项目模板说明ApplicationQt 应用程序包括普通窗体程序和 Qt Quick 程序。Library创建动态库、静态库、Qt Quick 扩展插件、Qt Creator 插件等。其他项目创建单元测试项目、Qt4 设计师自定义控件、子目录项目等。Non-Qt Project创建纯 C 或纯 C 项目。Import Project从版本控制系统中导入已有项目。常用的是Application右侧可以选择不同的 Qt 应用程序子模板子模板说明Qt Widgets Application普通窗体模板传统基于控件的窗体界面程序。Qt Console ApplicationQt 控制台应用程序图形界面开发中较少使用。Qt for Python使用 Python 开发 Qt 程序。Qt Quick Application使用 QML/Qt Quick 开发界面常用于移动端、嵌入式或更现代的动态界面。3.2.3 选择项目路径给 Qt 项目命名及选择保存项目的路径3.2.4 选择构建系统选择 Qt 项目的构建系统使用默认的 “qmake” 即可。Qt 中的构建工具有三种可供选择分别是构建工具说明qmakeQt 传统构建工具根据.pro文件生成 Makefile。入门阶段使用默认 qmake 即可。CMake跨平台构建工具本身不是编译器而是生成构建系统文件的工具。新版本 Qt 项目中也很常见。QbsQt Build Suite曾作为新一代构建工具出现但后来 Qt 官方已放弃维护。3.2.5 填写类信息设置界面对于基类的选择目前有三种基类基类说明QMainWindow主窗口类适合较复杂的应用程序通常包含菜单栏、工具栏、状态栏、停靠窗口等。QWidget最基础的窗口类适合简单窗体程序可以放置多个控件实现功能。QDialog对话框类常用于弹窗也可以作为简单主界面支持模态显示和返回值。上述三个类之间的关系如下图3.2.6 选择语言和翻译文件点击 “下一步” 进入如下界面此处选择的语言是 “汉语”, “英语” 这样的语言. 而不是 “编程语言”.由于我们暂时不考虑国际化问题, 直接下一步即可.3.2.7 选择 Qt 套件默认只有第一个 “Desktop Qt 5.14.2 MinGW 64-bit”如果安装配置了多个 Qt 套件就可以都选上。Qt 套件是指 Qt 程序从编译链接到运行环境的全部工具和 Qt 类库的集合对于 MinGW 版本 Qt 程序生成和调试至少需要 MinGW 中的编译器 g自动调用链接器、g 配套的基础库、调试器 gdb 还有使用 MinGW 环境编译而成的 Qt 类库自身。默认情况下在上面 Kit Selection 里选中全部套件。3.2.8 选择版本控制系统点击 “下一步” 进入 项目管理界面在项目管理界面可以设置作为子项目以及加入版本控制系统管理。这两个功能暂时用不到都用默认的 然后点击 “完成” 。如果想把代码提交到码云或者 GitHub, 可以在此处选择 git 作为版本控制系统.3.2.9 最终效果通过上述 8 个步骤, 完成了项目的创建.提示熟练之后创建一个项目通常不会超过 10 秒。项目创建完成之后Qt Creator 会直接进入代码编辑模式可以看到类似下图界面3.3 认识 Qt Creator 界面3.3.1 左边栏在编辑模式下左边竖排的两个窗口叫做 “边栏” 。① 是项目文件管理窗口② 是打开文件列表窗口。在 Qt Creator 菜单 “控件” ------- “Show Left Sidebar”或者使用快捷键“Alt 0” 可以控制边栏的显示和隐藏。边栏里的窗口数目可以增加边栏子窗口标题栏有一排小按钮最右边的是关闭按钮倒数第二个是增加分栏按钮可以添加多个边栏子窗口。边栏子窗口标题栏第一个控件是组合框可以选择该子窗口的功能视图类型目前可以选择 8 个视图类型视图类型说明项目项目文件管理视图可以选择项目里的文件进行编辑包括.pro文件。打开文档当前已经打开的文件列表文件名右边有*表示该文件被修改但尚未保存。书签管理代码书签方便跳转到指定代码位置。文件系统类似文件资源管理器可以查看项目文件夹中的实际文件。类视图查看项目中的类、成员函数、成员变量等。Git Branches查看当前 Git 分支。大纲显示当前文件的大纲如命名空间、类名、成员函数等。Tests测试相关视图。类型层次查看类的基类和派生类层次。Include Hierarchy查看.h、.cpp以及 Qt 类库头文件之间的包含关系。3.3.2 代码编辑区①和②导航按钮 “返回” 和 “前进”这与网页浏览器的前进和后退按钮类似可以在之前浏览的多个代码文件或一个代码文件里多个位置之间快速切换。③标识当前显示的文件是只读还是可写一般都是可写的。④文件类型图标当前显示文件的类型这个控件其实是一个菜单按钮点击可以弹出丰富的文件处理功能菜单。⑤打开的文件名可以在多个打开的文件之间选择切换与边栏的 “打开文档” 视图是对应的。⑥关闭当前显示的文档。⑦为当前显示的文件添加额外的C预处理指令一般用不着。⑧选择符号可以在当前显示的文件里多个函数、类、成员变量等之前快速切换与边栏大纲视图是对应的。⑨编辑区光标的行号和列号。⑩代码编辑区分栏可以增加多个编辑器窗口显示多个打开的文档或显示较大源码文件的多个位置。行首区主要用来显示代码行号以及调试断点标志和代码书签标志。右击行首区可以弹出右键菜单菜单里可以切换书签、编辑书签以及设置或取消断点。同一行是既可以打断点也可以设置书签的二者不冲突其实它们根本就没关系。单击行号前面的浅灰色空白区可以直接打断点再次单击可以取消断点另外也可以用快捷键 F9 设置或取消断点。代码书签一般用右键菜单来设置也可以用快捷键 CtrlM 设置或取消书签。编辑区写代码的区域。3.3.3 UI设计界面双击 widget.ui 文件Qt Creator 会自动进入设计模式可以对图形界面进行可视化编辑①组件选择窗口。组件选择窗口分为多个组如 Layouts、Buttons、Display Widgets 等界面设计的常见组件都可以在组件选择窗口中找到。②UI 设计窗口。如果要将某个组件放置到该窗口上时从组件选择窗口上拖放一个组件到窗体上即可。③动作编辑窗口。动作编辑窗口包括 Action Editor 以及 Signals 和 Slots 编辑器。 Action Editor 主要是用来新建 Action并且通过拖拽的动作将新建好的 Action 添加到菜单栏和工具栏上Signals和 Slots 编辑器用于可视化地进行信号与槽的关联。④对象浏览窗口。用树状视图显示窗体上各组件之间的布局包含关系视图有两列显示每个组件的对象名称ObjectName和类名称。⑤属性设置窗口。显示某个选中的组件或窗体的各种属性及其取值可以在属性设置窗口里修改这些属性的值。3.3.4 构建区左下角一共有四个按钮下面分别介绍一下第一个按钮是选择构建项目使用的 Qt 套件和构建目标程序的类型Debug 或 Release。对于第一个按钮默认的是Debug构建的是 Debug 类型的目标程序。如果需要构建 Release 版目标程序点开左下角第一个按钮这里有三种构建模式模式说明Debug以-g模式编译带符号信息便于调试。Profile介于 Debug 和 Release 之间兼顾性能分析和调试。Release优化后的发布版本性能通常比 Debug 更好。上图是针对项目只用到单一 Qt 套件的如果之前配置了多个 Qt 套件看到的类似下图如果项目配置了多个可用的 Qt 套件点开左下角第一个按钮后会看到各个套件以及构建类型如果要切换 Qt 套件或构建类型直接选中相应条目然后点击运行按钮就行了。如果构建和运行时没出错就会显示出构建好的目标程序界面。第二个是运行按钮快捷键是 CtrlR如果还没构建项目或刚修改了代码直接点击运行的话Qt Creator 会自动构建生成新的目标程序并运行。第三个是调试按钮快捷键是 F5。调试程序之前Qt Creator 会自动构建生成最新的目标程序并进入调试模式。第四个是构建按钮快捷键是 CtrlB只构建最新的目标程序但不运行。4.Qt Hello World 程序4.1 使用 “按钮” 实现4.1.1 纯代码方式实现实现效果如下图4.1.2 可视化操作实现1双击 widget.ui 文件2拖拽控件至 ui 界面窗口并修改内容3构建并运行效果如下所示4.2 使用 “标签” 实现4.2.1 纯代码方式实现实现效果4.2.2 可视化操作实现1双击** widget.ui 文件2拖拽 “标签” 至 UI 设计界面中并双击修改标签内容3实现效果如下图所示5. 项目文件解析5.1 .pro 文件解析工程创建完成后项目目录中会生成一个后缀为.pro的文件。.pro是 qmake 使用的工程配置文件用来描述项目模块、源文件、头文件、UI 文件以及最终生成的目标程序。.pro文件中的核心内容示例如下QT core gui greaterThan(QT_MAJOR_VERSION, 4): QT widgets TARGET QtFirst TEMPLATE app SOURCES main.cpp \ widget.cpp HEADERS widget.h“.pro” 文件的写法如下1、注释.pro文件中使用#表示注释。2、QT core gui表示项目会使用 Qt 的core和gui模块。Qt5 包含的模块如下图所示3、greaterThan(QT_MAJOR_VERSION, 4): QT widgets表示当 Qt 主版本号大于 4 时额外加入widgets模块。Qt 5 及更高版本如果要使用传统控件窗口一般都需要加入该模块。4、TARGET指定生成的应用程序名称例如TARGET QtDemo。5、TEMPLATE指定项目模板常见取值有app、lib、vcapp、vclib、subdirs。app建立一个应用程序的 makefile。这是默认值所以如果模板没有被指定这个将被使用。lib 建立一个库的 makefile。vcapp建立一个应用程序的 VisualStudio 项目文件。vclib 建立一个库的 VisualStudio 项目文件。subdirs这是一个特殊的模板它可以创建一个能够进入特定目录的 makefile 并且为它调用make 的 makefile。6、SOURCES指定项目中的源文件例如main.cpp、widget.cpp。工程中包含的源文件SOURCES main.cpp/widget.cpp7、HEADERS指定项目中的头文件例如widget.h。工程中包含的头文件HEADERS widget.h8、RESOURCES指定资源文件例如painter.qrc。工程中包含的资源文件RESOURCES painter.qrc9、FORMS指定 UI 设计文件例如widget.ui。工程中包含的 “ui” 设计文件FORMS widget.ui10、CONFIG c11表示启用 C11 相关配置。配置信息CONFIG c11 (使用 c11 的特性)CONFIG 用来告诉 qmake 关于应用程序的配置信息5.2 widget.h 文件解析widget.h是窗口类的头文件主要放类声明、成员变量和函数声明。Q_OBJECT如果类中要使用 Qt 的信号与槽机制就需要加入Q_OBJECT宏。*Ui::Widgetuiui指针指向可视化设计出来的界面对象。后续访问界面上的控件时通常需要通过ui指针进行访问。5.3 main.cpp 文件解析使用 Qt Creator 新建工程后main.cpp一般会生成类似下面的入口代码核心逻辑可以简化理解为#includewidget.h#includeQApplicationintmain(intargc,char*argv[]){QApplicationa(argc,argv);Widget w;w.show();returna.exec();}解释Qt 系统提供的标准类名 声明头文件没有 .h 后缀Qt 一个类对应一个头文件类名 就是 头文件名QApplication 为应用程序类QApplication aa为应用程序对象有且仅有一个。QApplication 管理图形用户界面应用程序的控制流和主要设置QApplication 是 Qt 的整个后台管理的命脉。它包含主事件循环在其中来自窗口系统和其它资源的所有事件处理和调度。它也处理应用程序的初始化和结束并且提供对话管理。对于任何一个使用 Qt 的图形用户界面应用程序都正好存在一个 QApplication 对象而不论这个应用程序在同一时间内是不是有 0、1、2 或更多个窗口。myWidget w; //实例化窗口对象w.show() //调用show函数显示窗口a.exec() 程序进入消息循环等待对用户输入进行响应。这里 main()把控制权转交给QtQt 完成事件处理工作当应用程序退出的时候 exec() 的值就会返回。在 exec() 中Qt 接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。5.4 widget.cpp 文件解析widget.cpp 文件是类 Widget 的实现代码所有在窗体上要实现的功能添加在此文件中5.5 widget.ui 文件解析widget.ui 是窗体界面定义文件是一个 XML 文件定义了窗口上的所有组件的属性设置、布局及其信号与槽函数的关联等。用 UI 设计器可视化设计的界面都由 Qt 自动解析并以 XML 文件的形式保存下来。在设计界面时只需在 UI 设计器里进行可视化设计即可而不用管 widget.ui 文件是怎么生成的。6. Qt 编程注意事项6.1 Qt 中的命名规范类名首字母大写多个单词之间使用大驼峰命名例如MainWindow。函数名和变量名首字母小写后续单词首字母大写例如showMessage()、userName。提示Qt 更偏好驼峰命名法。6.2 Qt Creator 中的快捷键注释Ctrl /运行Ctrl R编译Ctrl B字体缩放Ctrl 鼠标滚轮查找Ctrl F整行移动Ctrl Shift ↑ / ↓帮助文档F1自动对齐Ctrl I同名.h和.cpp文件切换F4生成函数声明对应的定义Alt Enter6.3 使用帮助文档Qt 开发中经常需要查官方文档常见方式有三种方式一将光标放到要查询的类名或方法名上按F1。方式二点击 Qt Creator 左侧边栏中的“帮助”按钮。出现如下界面方式三在 Qt Creator 安装目录的bin文件夹中找到assistant.exe双击打开 Qt Assistant。以查询QPushButton为例1. 新建项目并在项目中使用 QPushButton 控件。 2. 打开帮助文档在“索引”中输入 QPushButton。提示不要使用中文文档!建议优先阅读英文文档。Qt 官方文档整体质量比较高类说明、函数参数、示例代码都比较完整后续开发中会经常用到。6.4 认识对象模型对象树在 Qt 中创建很多对象的时候会提供一个 Parent 对象指针下面来解释这个 parent 到底是干什么的。• QObject 是以对象树的形式组织起来的。◦ 当创建一个 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 保持同样的行为。正常情况下这也不会发生什么问题。来看下面的代码片段作为父组件的 window 和作为子组件的 quit 都是 QObject 的子类事实上它们都是QWidget的子类而QWidget 是 QObject 的子类。这段代码是正确的quit 的析构函数不会被调用两次因为标准 C 要求局部对象的析构顺序应该按照其创建顺序的相反过程。因此这段代码在超出作用域时会先调用 quit 的析构函数将其从父对象 window 的子对象列表中删除然后才会再调用window 的析构函数。但是如果我们使用下面的代码情况又有所不同析构顺序就有了问题。我们看到在上面的代码中作为父对象的 window 会首先被析构因为它是最后一个创建的对象。在析构过程中它会调用子对象列表中每一个对象的析构函数也就是说 quit 此时就被析构了。然后代码继续执行在 window 析构之后quit 也会被析构因为 quit 也是一个局部变量在超出作用域的时候当然也需要析构。但是这时候已经是第二次调用 quit 的析构函数了C 不允许调用两次析构函数因此程序崩溃了。由此我们看到Qt 的对象树机制虽然在一定程度上解决了内存问题但是也引入了一些值得注意的事情。这些细节在今后的开发过程中很可能时不时跳出来烦扰一下所以我们最好从开始就养成良好习惯提示在 Qt 中尽量在构造的时候就指定 parent 对象并且大胆在堆上创建。Qt 对象树如图代码示例1、创建一个新工程并编译运行生成如下窗口2、选中工程名鼠标右键 ------- “add new…”或 “添加新文件” 3、选择 “choose…”弹出如下界面4、点击 “下一步”弹出如下对话框5、点击 “完成” 之后手动创建类的头文件以及源文件会自动添加到目标工程中6、修改头文件7、编写源文件8、编译并运行9、当关闭弹出的对话框时就会自动调用按钮的析构函数10、观察析构函数的执行顺序11、执行结果12、执行结果分析对象树确保的是先释放子节点的内存, 后释放父节点的内存.而析构函数的调用顺序则不一定遵守上述要求. 因此看到子节点的析构执行顺序反而在父节点析构顺序之后.注意?调用析构函数和释放内存并非是同一件事情.6.5 Qt 窗口坐标体系坐标体系以左上角为原点0,0X向右增加Y向下增加。对于嵌套窗口其坐标是相对于父窗口来说的。示例使用Qt中的坐标系设置控件的位置运行结果如下图示
一、Qt 概述
发布时间:2026/6/1 2:00:03
目录第一章 Qt 概述Qt 简介2. 搭建 Qt 开发环境2.1 Qt 的开发工具概述2.2 Qt SDK 的下载和安装2.2.1 Qt SDK 的下载2.2.2 Qt SDK 的安装2.3 验证 Qt SDK 安装是否成功2.4 Qt 环境变量配置3.1 Qt Creator 概览3.2 使用 Qt Creator 新建项目3.2.1 新建项目3.2.2 选择项目模板3.2.3 选择项目路径3.2.4 选择构建系统3.2.5 填写类信息设置界面3.2.6 选择语言和翻译文件3.2.7 选择 Qt 套件3.2.8 选择版本控制系统3.2.9 最终效果3.3 认识 Qt Creator 界面3.3.1 左边栏3.3.2 代码编辑区3.3.3 UI设计界面3.3.4 构建区4.Qt Hello World 程序4.1 使用 按钮 实现4.1.1 纯代码方式实现4.1.2 可视化操作实现4.2 使用 标签 实现4.2.1 纯代码方式实现4.2.2 可视化操作实现5. 项目文件解析5.1 .pro 文件解析5.2 widget.h 文件解析5.3 main.cpp 文件解析5.4 widget.cpp 文件解析5.5 widget.ui 文件解析6. Qt 编程注意事项6.1 Qt 中的命名规范6.2 Qt Creator 中的快捷键6.3 使用帮助文档6.4 认识对象模型对象树6.5 Qt 窗口坐标体系第一章 Qt 概述Qt 简介Qt 是一个跨平台的 C 图形用户界面应用程序框架常用于开发桌面应用、嵌入式界面和一些跨平台工具。对qt背景感兴趣的自己百度哈我这勒一笔带过了主要重点先放在环境搭建、Qt Creator 的基本使用以及第一个窗口程序的运行流程上。2. 搭建 Qt 开发环境2.1 Qt 的开发工具概述Qt 支持多种开发工具常见的有 Qt Creator、Visual Studio、Eclipse。入门阶段建议直接使用Qt Creator因为它和 Qt 框架集成度最高创建项目、设计界面、编译运行、调试都比较方便。Qt CreatorQt 官方 IDE适合 Qt 项目开发支持代码编辑、界面设计、项目构建、调试、帮助文档等功能。Visual Studio微软 IDE也可以配置 Qt 开发环境但整体更偏通用 C/Windows 开发。Eclipse跨平台 IDE可以通过插件支持 C/C 和 Qt 开发但 Qt 入门阶段一般不优先选择。提示后续示例主要使用 Qt Creator 开发 Qt 程序。2.2 Qt SDK 的下载和安装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.23、选择Windows 桌面应用程序2.2.2 Qt SDK 的安装1、找到下载的文件并双击注意在双击之前先断网否则需要我们注册 Qt 账号登录后才能进入下一步安装2、双击之后进入如下界面3、选择安装路径时不能出现中文路径否则即使安装上也无法使用4、选择安装组件这里我们安装的是 Qt Creator。如果电脑磁盘空间允许建议全选以便后续使用如果空间不允许请看第5步5、选择部分组件说明其他未安装的组件在使用时可以另行添加6、后面一路同意安装就行了后面的几个安装界面懒得搞了都看得懂。2.3 验证 Qt SDK 安装是否成功1、双击打开 Qt Creator 工具并进入到 “欢迎模式” 下的 “示例” 界面2、在 “示例” 中任选其中一个单击打开该示例。在单击之后会弹出一个窗口关闭即可如果能构建并运行说明安装无误。运行结果如下图2.4 Qt 环境变量配置1、找到Qt的安装路径复制 “bin” 路径2、“此电脑” ------ 鼠标右键 “属性” ------ “高级系统设置” ------ “环境变量”3、“新建” ------ 填入 “bin” 路径 ------ “确定” ;4、注意在关掉所有窗口时一定要点击 “确定” 否则上述配置无效。提示为什么要设置环境变量环境变量是在操作系统中一个具有特定名字的对象它包含了一个或者多个应用程序将要使用到的信息。例如Windows 和 DOS 操作系统中的 path 环境变量当要求系统运行一个程序而没有告诉它程序所在的完整路径时系统除了在当前目录下面寻找此程序外还会到 path 中指定的路径去找。在 Windows 上设置 Qt 的环境变量是为了能够在命令行或其他应用程序中直接访问 Qt 相关的命令和工具。**认识 Qt Creator3.1 Qt Creator 概览从 开始菜单 或者 快捷方式 打开 Qt Creator 集成开发环境启动之后看到类似下面的界面①菜单栏。菜单栏一共有 8 个菜单选项包含了常用的功能菜单菜单项说明文件包含新建、打开、关闭项目和文件、打印、退出等基本功能。编辑包含撤销、剪切、复制、查找、选择编码等功能。构建包含构建和运行项目等相关功能。调试包含调试运行项目等相关功能。Analyze包含 QML 分析器、Valgrind 内存和功能分析器等相关功能。工具包含快速定位、外部工具以及 Qt Creator 各项配置入口。控件包含窗口布局相关功能例如全屏显示、隐藏边栏等。帮助包含 Qt 帮助、Qt Creator 版本信息、报告 bug、插件管理等功能。② 模式选择Qt Creator 左侧提供多个工作模式。模式说明欢迎模式提供打开项目、新建项目、查看示例、查看教程等快捷入口。编辑模式用于查看和编辑代码支持语法高亮、代码补全、函数跳转、帮助文档等功能。设计模式集成 Qt Designer可视化设计界面、设置控件属性、调整布局、编辑信号与槽。调试模式支持断点、单步调试、变量查看、线程查看等调试功能。项目模式用于配置构建设置、运行设置、编辑器设置、代码风格和依赖关系。帮助模式集成 Qt Assistant可以查看 Qt 和 Qt Creator 的相关文档。③ 构建套件选择器包含目标选择器、运行按钮、调试按钮和构建按钮。按钮/区域说明目标选择器选择要构建的项目、Qt 库、Debug/Release 类型等。运行按钮构建并运行当前项目。调试按钮以调试模式运行当前项目。构建按钮只构建项目不运行程序。④ 欢迎模式入口入口说明Project新建工程、打开工程。示例Qt 官方示例。教程Qt 官方教程。⑤ 定位器用于快速定位项目、文件、类、方法、帮助文档和文件系统。⑥ 输出窗格常用输出窗口如下。输出窗口说明问题显示编译错误和警告。Search Results显示搜索结果。应用程序输出显示程序运行时输出的信息。编译输出显示编译过程中的详细输出。Debugger Console显示调试器相关输出。概要信息显示运行或构建概要。Test Results显示测试结果。⑦ 会话记录用于管理 Qt Creator 的会话。⑧ 新建项目快速创建新项目。⑨ 打开已有项目快速打开已有项目。3.2 使用 Qt Creator 新建项目3.2.1 新建项目打开 Qt Creator 在菜单栏中选中“文件” -------- “新建文件或项目” 或者使用快捷键Ctrl n或者直接点击“new”在欢迎模式下直接点击 New如下图示3.2.2 选择项目模板弹出如下对话框项目模板说明ApplicationQt 应用程序包括普通窗体程序和 Qt Quick 程序。Library创建动态库、静态库、Qt Quick 扩展插件、Qt Creator 插件等。其他项目创建单元测试项目、Qt4 设计师自定义控件、子目录项目等。Non-Qt Project创建纯 C 或纯 C 项目。Import Project从版本控制系统中导入已有项目。常用的是Application右侧可以选择不同的 Qt 应用程序子模板子模板说明Qt Widgets Application普通窗体模板传统基于控件的窗体界面程序。Qt Console ApplicationQt 控制台应用程序图形界面开发中较少使用。Qt for Python使用 Python 开发 Qt 程序。Qt Quick Application使用 QML/Qt Quick 开发界面常用于移动端、嵌入式或更现代的动态界面。3.2.3 选择项目路径给 Qt 项目命名及选择保存项目的路径3.2.4 选择构建系统选择 Qt 项目的构建系统使用默认的 “qmake” 即可。Qt 中的构建工具有三种可供选择分别是构建工具说明qmakeQt 传统构建工具根据.pro文件生成 Makefile。入门阶段使用默认 qmake 即可。CMake跨平台构建工具本身不是编译器而是生成构建系统文件的工具。新版本 Qt 项目中也很常见。QbsQt Build Suite曾作为新一代构建工具出现但后来 Qt 官方已放弃维护。3.2.5 填写类信息设置界面对于基类的选择目前有三种基类基类说明QMainWindow主窗口类适合较复杂的应用程序通常包含菜单栏、工具栏、状态栏、停靠窗口等。QWidget最基础的窗口类适合简单窗体程序可以放置多个控件实现功能。QDialog对话框类常用于弹窗也可以作为简单主界面支持模态显示和返回值。上述三个类之间的关系如下图3.2.6 选择语言和翻译文件点击 “下一步” 进入如下界面此处选择的语言是 “汉语”, “英语” 这样的语言. 而不是 “编程语言”.由于我们暂时不考虑国际化问题, 直接下一步即可.3.2.7 选择 Qt 套件默认只有第一个 “Desktop Qt 5.14.2 MinGW 64-bit”如果安装配置了多个 Qt 套件就可以都选上。Qt 套件是指 Qt 程序从编译链接到运行环境的全部工具和 Qt 类库的集合对于 MinGW 版本 Qt 程序生成和调试至少需要 MinGW 中的编译器 g自动调用链接器、g 配套的基础库、调试器 gdb 还有使用 MinGW 环境编译而成的 Qt 类库自身。默认情况下在上面 Kit Selection 里选中全部套件。3.2.8 选择版本控制系统点击 “下一步” 进入 项目管理界面在项目管理界面可以设置作为子项目以及加入版本控制系统管理。这两个功能暂时用不到都用默认的 然后点击 “完成” 。如果想把代码提交到码云或者 GitHub, 可以在此处选择 git 作为版本控制系统.3.2.9 最终效果通过上述 8 个步骤, 完成了项目的创建.提示熟练之后创建一个项目通常不会超过 10 秒。项目创建完成之后Qt Creator 会直接进入代码编辑模式可以看到类似下图界面3.3 认识 Qt Creator 界面3.3.1 左边栏在编辑模式下左边竖排的两个窗口叫做 “边栏” 。① 是项目文件管理窗口② 是打开文件列表窗口。在 Qt Creator 菜单 “控件” ------- “Show Left Sidebar”或者使用快捷键“Alt 0” 可以控制边栏的显示和隐藏。边栏里的窗口数目可以增加边栏子窗口标题栏有一排小按钮最右边的是关闭按钮倒数第二个是增加分栏按钮可以添加多个边栏子窗口。边栏子窗口标题栏第一个控件是组合框可以选择该子窗口的功能视图类型目前可以选择 8 个视图类型视图类型说明项目项目文件管理视图可以选择项目里的文件进行编辑包括.pro文件。打开文档当前已经打开的文件列表文件名右边有*表示该文件被修改但尚未保存。书签管理代码书签方便跳转到指定代码位置。文件系统类似文件资源管理器可以查看项目文件夹中的实际文件。类视图查看项目中的类、成员函数、成员变量等。Git Branches查看当前 Git 分支。大纲显示当前文件的大纲如命名空间、类名、成员函数等。Tests测试相关视图。类型层次查看类的基类和派生类层次。Include Hierarchy查看.h、.cpp以及 Qt 类库头文件之间的包含关系。3.3.2 代码编辑区①和②导航按钮 “返回” 和 “前进”这与网页浏览器的前进和后退按钮类似可以在之前浏览的多个代码文件或一个代码文件里多个位置之间快速切换。③标识当前显示的文件是只读还是可写一般都是可写的。④文件类型图标当前显示文件的类型这个控件其实是一个菜单按钮点击可以弹出丰富的文件处理功能菜单。⑤打开的文件名可以在多个打开的文件之间选择切换与边栏的 “打开文档” 视图是对应的。⑥关闭当前显示的文档。⑦为当前显示的文件添加额外的C预处理指令一般用不着。⑧选择符号可以在当前显示的文件里多个函数、类、成员变量等之前快速切换与边栏大纲视图是对应的。⑨编辑区光标的行号和列号。⑩代码编辑区分栏可以增加多个编辑器窗口显示多个打开的文档或显示较大源码文件的多个位置。行首区主要用来显示代码行号以及调试断点标志和代码书签标志。右击行首区可以弹出右键菜单菜单里可以切换书签、编辑书签以及设置或取消断点。同一行是既可以打断点也可以设置书签的二者不冲突其实它们根本就没关系。单击行号前面的浅灰色空白区可以直接打断点再次单击可以取消断点另外也可以用快捷键 F9 设置或取消断点。代码书签一般用右键菜单来设置也可以用快捷键 CtrlM 设置或取消书签。编辑区写代码的区域。3.3.3 UI设计界面双击 widget.ui 文件Qt Creator 会自动进入设计模式可以对图形界面进行可视化编辑①组件选择窗口。组件选择窗口分为多个组如 Layouts、Buttons、Display Widgets 等界面设计的常见组件都可以在组件选择窗口中找到。②UI 设计窗口。如果要将某个组件放置到该窗口上时从组件选择窗口上拖放一个组件到窗体上即可。③动作编辑窗口。动作编辑窗口包括 Action Editor 以及 Signals 和 Slots 编辑器。 Action Editor 主要是用来新建 Action并且通过拖拽的动作将新建好的 Action 添加到菜单栏和工具栏上Signals和 Slots 编辑器用于可视化地进行信号与槽的关联。④对象浏览窗口。用树状视图显示窗体上各组件之间的布局包含关系视图有两列显示每个组件的对象名称ObjectName和类名称。⑤属性设置窗口。显示某个选中的组件或窗体的各种属性及其取值可以在属性设置窗口里修改这些属性的值。3.3.4 构建区左下角一共有四个按钮下面分别介绍一下第一个按钮是选择构建项目使用的 Qt 套件和构建目标程序的类型Debug 或 Release。对于第一个按钮默认的是Debug构建的是 Debug 类型的目标程序。如果需要构建 Release 版目标程序点开左下角第一个按钮这里有三种构建模式模式说明Debug以-g模式编译带符号信息便于调试。Profile介于 Debug 和 Release 之间兼顾性能分析和调试。Release优化后的发布版本性能通常比 Debug 更好。上图是针对项目只用到单一 Qt 套件的如果之前配置了多个 Qt 套件看到的类似下图如果项目配置了多个可用的 Qt 套件点开左下角第一个按钮后会看到各个套件以及构建类型如果要切换 Qt 套件或构建类型直接选中相应条目然后点击运行按钮就行了。如果构建和运行时没出错就会显示出构建好的目标程序界面。第二个是运行按钮快捷键是 CtrlR如果还没构建项目或刚修改了代码直接点击运行的话Qt Creator 会自动构建生成新的目标程序并运行。第三个是调试按钮快捷键是 F5。调试程序之前Qt Creator 会自动构建生成最新的目标程序并进入调试模式。第四个是构建按钮快捷键是 CtrlB只构建最新的目标程序但不运行。4.Qt Hello World 程序4.1 使用 “按钮” 实现4.1.1 纯代码方式实现实现效果如下图4.1.2 可视化操作实现1双击 widget.ui 文件2拖拽控件至 ui 界面窗口并修改内容3构建并运行效果如下所示4.2 使用 “标签” 实现4.2.1 纯代码方式实现实现效果4.2.2 可视化操作实现1双击** widget.ui 文件2拖拽 “标签” 至 UI 设计界面中并双击修改标签内容3实现效果如下图所示5. 项目文件解析5.1 .pro 文件解析工程创建完成后项目目录中会生成一个后缀为.pro的文件。.pro是 qmake 使用的工程配置文件用来描述项目模块、源文件、头文件、UI 文件以及最终生成的目标程序。.pro文件中的核心内容示例如下QT core gui greaterThan(QT_MAJOR_VERSION, 4): QT widgets TARGET QtFirst TEMPLATE app SOURCES main.cpp \ widget.cpp HEADERS widget.h“.pro” 文件的写法如下1、注释.pro文件中使用#表示注释。2、QT core gui表示项目会使用 Qt 的core和gui模块。Qt5 包含的模块如下图所示3、greaterThan(QT_MAJOR_VERSION, 4): QT widgets表示当 Qt 主版本号大于 4 时额外加入widgets模块。Qt 5 及更高版本如果要使用传统控件窗口一般都需要加入该模块。4、TARGET指定生成的应用程序名称例如TARGET QtDemo。5、TEMPLATE指定项目模板常见取值有app、lib、vcapp、vclib、subdirs。app建立一个应用程序的 makefile。这是默认值所以如果模板没有被指定这个将被使用。lib 建立一个库的 makefile。vcapp建立一个应用程序的 VisualStudio 项目文件。vclib 建立一个库的 VisualStudio 项目文件。subdirs这是一个特殊的模板它可以创建一个能够进入特定目录的 makefile 并且为它调用make 的 makefile。6、SOURCES指定项目中的源文件例如main.cpp、widget.cpp。工程中包含的源文件SOURCES main.cpp/widget.cpp7、HEADERS指定项目中的头文件例如widget.h。工程中包含的头文件HEADERS widget.h8、RESOURCES指定资源文件例如painter.qrc。工程中包含的资源文件RESOURCES painter.qrc9、FORMS指定 UI 设计文件例如widget.ui。工程中包含的 “ui” 设计文件FORMS widget.ui10、CONFIG c11表示启用 C11 相关配置。配置信息CONFIG c11 (使用 c11 的特性)CONFIG 用来告诉 qmake 关于应用程序的配置信息5.2 widget.h 文件解析widget.h是窗口类的头文件主要放类声明、成员变量和函数声明。Q_OBJECT如果类中要使用 Qt 的信号与槽机制就需要加入Q_OBJECT宏。*Ui::Widgetuiui指针指向可视化设计出来的界面对象。后续访问界面上的控件时通常需要通过ui指针进行访问。5.3 main.cpp 文件解析使用 Qt Creator 新建工程后main.cpp一般会生成类似下面的入口代码核心逻辑可以简化理解为#includewidget.h#includeQApplicationintmain(intargc,char*argv[]){QApplicationa(argc,argv);Widget w;w.show();returna.exec();}解释Qt 系统提供的标准类名 声明头文件没有 .h 后缀Qt 一个类对应一个头文件类名 就是 头文件名QApplication 为应用程序类QApplication aa为应用程序对象有且仅有一个。QApplication 管理图形用户界面应用程序的控制流和主要设置QApplication 是 Qt 的整个后台管理的命脉。它包含主事件循环在其中来自窗口系统和其它资源的所有事件处理和调度。它也处理应用程序的初始化和结束并且提供对话管理。对于任何一个使用 Qt 的图形用户界面应用程序都正好存在一个 QApplication 对象而不论这个应用程序在同一时间内是不是有 0、1、2 或更多个窗口。myWidget w; //实例化窗口对象w.show() //调用show函数显示窗口a.exec() 程序进入消息循环等待对用户输入进行响应。这里 main()把控制权转交给QtQt 完成事件处理工作当应用程序退出的时候 exec() 的值就会返回。在 exec() 中Qt 接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。5.4 widget.cpp 文件解析widget.cpp 文件是类 Widget 的实现代码所有在窗体上要实现的功能添加在此文件中5.5 widget.ui 文件解析widget.ui 是窗体界面定义文件是一个 XML 文件定义了窗口上的所有组件的属性设置、布局及其信号与槽函数的关联等。用 UI 设计器可视化设计的界面都由 Qt 自动解析并以 XML 文件的形式保存下来。在设计界面时只需在 UI 设计器里进行可视化设计即可而不用管 widget.ui 文件是怎么生成的。6. Qt 编程注意事项6.1 Qt 中的命名规范类名首字母大写多个单词之间使用大驼峰命名例如MainWindow。函数名和变量名首字母小写后续单词首字母大写例如showMessage()、userName。提示Qt 更偏好驼峰命名法。6.2 Qt Creator 中的快捷键注释Ctrl /运行Ctrl R编译Ctrl B字体缩放Ctrl 鼠标滚轮查找Ctrl F整行移动Ctrl Shift ↑ / ↓帮助文档F1自动对齐Ctrl I同名.h和.cpp文件切换F4生成函数声明对应的定义Alt Enter6.3 使用帮助文档Qt 开发中经常需要查官方文档常见方式有三种方式一将光标放到要查询的类名或方法名上按F1。方式二点击 Qt Creator 左侧边栏中的“帮助”按钮。出现如下界面方式三在 Qt Creator 安装目录的bin文件夹中找到assistant.exe双击打开 Qt Assistant。以查询QPushButton为例1. 新建项目并在项目中使用 QPushButton 控件。 2. 打开帮助文档在“索引”中输入 QPushButton。提示不要使用中文文档!建议优先阅读英文文档。Qt 官方文档整体质量比较高类说明、函数参数、示例代码都比较完整后续开发中会经常用到。6.4 认识对象模型对象树在 Qt 中创建很多对象的时候会提供一个 Parent 对象指针下面来解释这个 parent 到底是干什么的。• QObject 是以对象树的形式组织起来的。◦ 当创建一个 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 保持同样的行为。正常情况下这也不会发生什么问题。来看下面的代码片段作为父组件的 window 和作为子组件的 quit 都是 QObject 的子类事实上它们都是QWidget的子类而QWidget 是 QObject 的子类。这段代码是正确的quit 的析构函数不会被调用两次因为标准 C 要求局部对象的析构顺序应该按照其创建顺序的相反过程。因此这段代码在超出作用域时会先调用 quit 的析构函数将其从父对象 window 的子对象列表中删除然后才会再调用window 的析构函数。但是如果我们使用下面的代码情况又有所不同析构顺序就有了问题。我们看到在上面的代码中作为父对象的 window 会首先被析构因为它是最后一个创建的对象。在析构过程中它会调用子对象列表中每一个对象的析构函数也就是说 quit 此时就被析构了。然后代码继续执行在 window 析构之后quit 也会被析构因为 quit 也是一个局部变量在超出作用域的时候当然也需要析构。但是这时候已经是第二次调用 quit 的析构函数了C 不允许调用两次析构函数因此程序崩溃了。由此我们看到Qt 的对象树机制虽然在一定程度上解决了内存问题但是也引入了一些值得注意的事情。这些细节在今后的开发过程中很可能时不时跳出来烦扰一下所以我们最好从开始就养成良好习惯提示在 Qt 中尽量在构造的时候就指定 parent 对象并且大胆在堆上创建。Qt 对象树如图代码示例1、创建一个新工程并编译运行生成如下窗口2、选中工程名鼠标右键 ------- “add new…”或 “添加新文件” 3、选择 “choose…”弹出如下界面4、点击 “下一步”弹出如下对话框5、点击 “完成” 之后手动创建类的头文件以及源文件会自动添加到目标工程中6、修改头文件7、编写源文件8、编译并运行9、当关闭弹出的对话框时就会自动调用按钮的析构函数10、观察析构函数的执行顺序11、执行结果12、执行结果分析对象树确保的是先释放子节点的内存, 后释放父节点的内存.而析构函数的调用顺序则不一定遵守上述要求. 因此看到子节点的析构执行顺序反而在父节点析构顺序之后.注意?调用析构函数和释放内存并非是同一件事情.6.5 Qt 窗口坐标体系坐标体系以左上角为原点0,0X向右增加Y向下增加。对于嵌套窗口其坐标是相对于父窗口来说的。示例使用Qt中的坐标系设置控件的位置运行结果如下图示