一、Qt 概述

目录

  • [第一章 Qt 概述](#第一章 Qt 概述)
    • [Qt 简介](#Qt 简介)
    • [2. 搭建 Qt 开发环境](#2. 搭建 Qt 开发环境)
      • [2.1 Qt 的开发工具概述](#2.1 Qt 的开发工具概述)
      • [2.2 Qt SDK 的下载和安装](#2.2 Qt SDK 的下载和安装)
        • [2.2.1 Qt SDK 的下载](#2.2.1 Qt SDK 的下载)
        • [2.2.2 Qt SDK 的安装](#2.2.2 Qt SDK 的安装)
      • [2.3 验证 Qt SDK 安装是否成功](#2.3 验证 Qt SDK 安装是否成功)
      • [2.4 Qt 环境变量配置](#2.4 Qt 环境变量配置)
      • [3.1 Qt Creator 概览](#3.1 Qt Creator 概览)
      • [3.2 使用 Qt Creator 新建项目](#3.2 使用 Qt Creator 新建项目)
        • [3.2.1 新建项目](#3.2.1 新建项目)
        • [3.2.2 选择项目模板](#3.2.2 选择项目模板)
        • [3.2.3 选择项目路径](#3.2.3 选择项目路径)
        • [3.2.4 选择构建系统](#3.2.4 选择构建系统)
        • [3.2.5 填写类信息设置界面](#3.2.5 填写类信息设置界面)
        • [3.2.6 选择语言和翻译文件](#3.2.6 选择语言和翻译文件)
        • [3.2.7 选择 Qt 套件](#3.2.7 选择 Qt 套件)
        • [3.2.8 选择版本控制系统](#3.2.8 选择版本控制系统)
        • [3.2.9 最终效果](#3.2.9 最终效果)
      • [3.3 认识 Qt Creator 界面](#3.3 认识 Qt Creator 界面)
        • [3.3.1 左边栏](#3.3.1 左边栏)
        • [3.3.2 代码编辑区](#3.3.2 代码编辑区)
        • [3.3.3 UI设计界面](#3.3.3 UI设计界面)
        • [3.3.4 构建区](#3.3.4 构建区)
    • [4.Qt Hello World 程序](#4.Qt Hello World 程序)
      • [4.1 使用 "按钮" 实现](#4.1 使用 "按钮" 实现)
        • [4.1.1 纯代码方式实现](#4.1.1 纯代码方式实现)
        • [4.1.2 可视化操作实现](#4.1.2 可视化操作实现)
      • [4.2 使用 "标签" 实现](#4.2 使用 "标签" 实现)
        • [4.2.1 纯代码方式实现](#4.2.1 纯代码方式实现)
        • [4.2.2 可视化操作实现](#4.2.2 可视化操作实现)
    • [5. 项目文件解析](#5. 项目文件解析)
      • [5.1 .pro 文件解析](#5.1 .pro 文件解析)
      • [5.2 widget.h 文件解析](#5.2 widget.h 文件解析)
      • [5.3 main.cpp 文件解析](#5.3 main.cpp 文件解析)
      • [5.4 widget.cpp 文件解析](#5.4 widget.cpp 文件解析)
      • [5.5 widget.ui 文件解析](#5.5 widget.ui 文件解析)
    • [6. Qt 编程注意事项](#6. Qt 编程注意事项)
      • [6.1 Qt 中的命名规范](#6.1 Qt 中的命名规范)
      • [6.2 Qt Creator 中的快捷键](#6.2 Qt Creator 中的快捷键)
      • [6.3 使用帮助文档](#6.3 使用帮助文档)
      • [6.4 认识对象模型(对象树)](#6.4 认识对象模型(对象树))
      • [6.5 Qt 窗口坐标体系](#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 Creator: Qt 官方 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.2)

3、选择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 Creator

3.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 选择项目模板

弹出如下对话框:

项目模板 说明
Application Qt 应用程序,包括普通窗体程序和 Qt Quick 程序。
Library 创建动态库、静态库、Qt Quick 扩展插件、Qt Creator 插件等。
其他项目 创建单元测试项目、Qt4 设计师自定义控件、子目录项目等。
Non-Qt Project 创建纯 C 或纯 C++ 项目。
Import Project 从版本控制系统中导入已有项目。

常用的是 Application,右侧可以选择不同的 Qt 应用程序子模板:

子模板 说明
Qt Widgets Application 普通窗体模板,传统基于控件的窗体界面程序。
Qt Console Application Qt 控制台应用程序,图形界面开发中较少使用。
Qt for Python 使用 Python 开发 Qt 程序。
Qt Quick Application 使用 QML/Qt Quick 开发界面,常用于移动端、嵌入式或更现代的动态界面。
3.2.3 选择项目路径

给 Qt 项目命名及选择保存项目的路径;

3.2.4 选择构建系统

选择 Qt 项目的构建系统,使用默认的 "qmake" 即可。

Qt 中的构建工具有三种可供选择,分别是:

构建工具 说明
qmake Qt 传统构建工具,根据 .pro 文件生成 Makefile。入门阶段使用默认 qmake 即可。
CMake 跨平台构建工具,本身不是编译器,而是生成构建系统文件的工具。新版本 Qt 项目中也很常见。
Qbs Qt 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 设置或取消断点。代码

书签一般用右键菜单来设置,也可以用快捷键 Ctrl+M 设置或取消书签。

编辑区: 写代码的区域。

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 套件或构建类型,直接选中相应条目,然后点击运行按钮就行了。如果构建和运行时没出错,就会显示出构建好的目标程序界面。

第二个是运行按钮,快捷键是 Ctrl+R,如果还没构建项目或刚修改了代码,直接点击运行的话,

Qt Creator 会自动构建生成新的目标程序并运行。

第三个是调试按钮,快捷键是 F5。调试程序之前,Qt Creator 会自动构建生成最新的目标程序,并

进入调试模式。

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

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 文件中的核心内容示例如下:

qmake 复制代码
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 的 coregui 模块。Qt5 包含的模块如下图所示

3、greaterThan(QT_MAJOR_VERSION, 4): QT += widgets: 表示当 Qt 主版本号大于 4 时,额外加入 widgets 模块。Qt 5 及更高版本如果要使用传统控件窗口,一般都需要加入该模块。

4、TARGET: 指定生成的应用程序名称,例如 TARGET = QtDemo

5、TEMPLATE: 指定项目模板,常见取值有 applibvcappvclibsubdirs

app:建立一个应用程序的 makefile。这是默认值,所以如果模板没有被指定,这个将被使用。

lib :建立一个库的 makefile。

vcapp:建立一个应用程序的 VisualStudio 项目文件。

vclib: 建立一个库的 VisualStudio 项目文件。

subdirs:这是一个特殊的模板,它可以创建一个能够进入特定目录的 makefile 并且为它调用make 的 makefile。

6、SOURCES: 指定项目中的源文件,例如 main.cppwidget.cpp。工程中包含的源文件:SOURCES += main.cpp/widget.cpp

7、HEADERS: 指定项目中的头文件,例如 widget.h。工程中包含的头文件:HEADERS += widget.h

8、RESOURCES: 指定资源文件,例如 painter.qrc。工程中包含的资源文件:RESOURCES += painter.qrc

9、FORMS: 指定 UI 设计文件,例如 widget.ui。工程中包含的 "ui" 设计文件:FORMS += widget.ui

10、CONFIG += c++11: 表示启用 C++11 相关配置。配置信息:CONFIG += c++11 (使用 c++11 的特性)CONFIG 用来告诉 qmake 关于应用程序的配置信息

5.2 widget.h 文件解析

widget.h 是窗口类的头文件,主要放类声明、成员变量和函数声明。

Q_OBJECT: 如果类中要使用 Qt 的信号与槽机制,就需要加入 Q_OBJECT 宏。

*Ui::Widget ui: ui 指针指向可视化设计出来的界面对象。后续访问界面上的控件时,通常需要通过 ui 指针进行访问。

5.3 main.cpp 文件解析

使用 Qt Creator 新建工程后,main.cpp 一般会生成类似下面的入口代码:

核心逻辑可以简化理解为:

cpp 复制代码
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Widget w;
    w.show();

    return a.exec();
}

解释

  1. Qt 系统提供的标准类名 声明头文件没有 .h 后缀;
  2. Qt 一个类对应一个头文件,类名 就是 头文件名;
  3. QApplication 为应用程序类;QApplication a;(a为应用程序对象,有且仅有一个。)QApplication 管理图形用户界面应用程序的控制流和主要设置:

QApplication 是 Qt 的整个后台管理的命脉。它包含主事件循环,在其中来自窗口系统和其它资源的所有事件处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。

对于任何一个使用 Qt 的图形用户界面应用程序,都正好存在一个 QApplication 对象,而不论这个应用程序在同一时间内是不是有 0、1、2 或更多个窗口。

  1. myWidget w; //实例化窗口对象
  2. w.show(); //调用show函数显示窗口
  3. a.exec() :程序进入消息循环,等待对用户输入进行响应。这里 main()把控制权转交给Qt,Qt 完
    成事件处理工作,当应用程序退出的时候 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 + Enter

6.3 使用帮助文档

Qt 开发中经常需要查官方文档,常见方式有三种:

方式一: 将光标放到要查询的类名或方法名上,按 F1

方式二: 点击 Qt Creator 左侧边栏中的"帮助"按钮。

出现如下界面

方式三: 在 Qt Creator 安装目录的 bin 文件夹中找到 assistant.exe,双击打开 Qt Assistant。

以查询 QPushButton 为例:

text 复制代码
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,0),X向右增加,Y向下增加。

对于嵌套窗口,其坐标是相对于父窗口来说的。

示例: 使用Qt中的坐标系设置控件的位置;

运行结果如下图示:

相关推荐
m0_617493941 小时前
PySide6/PyQt6实现中英文切换完整教程(Qt Designer + Qt Linguist + 动态切换)
开发语言·qt
咸鱼翻身小阿橙1 小时前
文件读写 + Qt Model/View + 自定义分页+搜索过滤
java·数据库·qt
草莓熊Lotso1 小时前
【Linux网络】深入理解 HTTP 协议(一):从基础概念到 URL 编码解码
linux·网络·c++·网络协议·http·软件工程
眠りたいです1 小时前
现代C++:C++17中的新语言特性
开发语言·c++·c++17
一只旭宝1 小时前
【C++入门精讲17】序列容器
开发语言·c++
郝学胜-神的一滴1 小时前
Qt 高级开发 021:零基础吃透 QVBoxLayout 垂直布局
开发语言·c++·qt·程序人生·用户界面
basketball6161 小时前
C++进阶:2. std::move 和 std::forward 函数
java·开发语言·c++
玖釉-1 小时前
LeetCode Hot 100 知识点总结与算法指南
c++·windows·算法·leetcode