🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏:https://blog.csdn.net/qinjh_/category_13030435.html

9efbcbc3d25747719da38c01b3fa9b4f.gif

目录

Qt 背景介绍

什么是 Qt

Qt 支持的平台

Qt 版本

Qt 的优点

Qt 的应用场景

Qt 的发展前景及就业分析

搭建 Qt 开发环境

Qt 的开发工具概述

Qt SDK 的下载和安装

Qt SDK 的安装

环境变量配置

使用 Qt Creator 新建项目

认识 Qt Creator 界面

项目文件解析

Qt 编程注意事项

Qt Hello World 程序

认识对象模型(对象树)

Qt 窗口坐标体系


前言

    💬 hello! 各位铁子们大家好哇。

             今日更新了qt基础知识的内容
    🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

Qt 背景介绍

什么是 Qt

Qt 是一个 跨平台的 C++ 图形用户界面应用程序框架 。它为应用程序开发者提供了建立艺术级图形 界面所需的所有功能。它是完全面向对象的,很容易扩展。Qt 为开发者提供了一种基于组件的开发模 式,开发者可以通过简单的拖拽和组合来实现复杂的应用程序,同时也可以使用 C++ 语言进行高级开 发。

图形用户界面 :指采用图形方式显示的计算机操作用户界面,是计算机与其使用者之间的对话接口, 是计算机系统的重要组成部分。 

Qt 支持的平台

Qt 版本

  • Windows – XP、Vista、Win7、Win8、Win2008、Win10 
  • Unix/X11 – Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX、FreeBSD、 BSD/OS、和其他很多 X11 平台
  • Macintosh – Mac OS X
  • Embedded – 有帧缓冲支持的嵌入式 Linux 平台,Windows CE
  • Android

Qt 在发布的时候还提供了两种许可证

  • 商业许可: 开发者以商业目的使用Qt框架进行开发和发布软件的许可,开发者需要购买商业许可并 按照相关规定使用Qt框架。商业许可提供了更多的功能和服务,适合于商业软件开发。
  • 开源许可: 开发者以非商业目的使用Qt框架进行开发和发布软件的许可,开发者可以免费使用Qt框 架,但需要遵守开源许可协议的要求,如在软件中包含Qt许可协议的声明等。

Qt 的优点

  • 跨平台,几乎支持所有的平台;
  • 接口简单,容易上手,学习 QT 框架对学习其他框架有参考意义。
  • 一定程度上简化了内存回收机制;
  • 开发效率高,能够快速的构建应用程序。
  • 有很好的社区氛围,市场份额在缓慢上升。
  • 可以进行嵌入式开发。

Qt 的应用场景

  • 桌面应用程序

Qt 能够创建各种类型的桌面应用程序,包括文件管理器、媒体播放器、绘图程序等。Qt 应用程序支持 多种操作系统,可以运行在 Windows、Linux、macOS 等桌面操作系统上。

  • 移动应用程序

Qt 支持 Android 和 IOS 移动操作系统,为应用程序提供了强大的跨平台能力。可以使用 Qt 构建各种 移动应用程序,例如社交应用、游戏、娱乐等。

  • 嵌入式系统

Qt 在嵌入式领域应用非常广泛,它可以构建面向各种设备的图形应用程序,在机顶盒、车载娱乐系 统、安防监控设备等领域具有广泛的应用。

Qt 的发展前景及就业分析

Qt 是一个强大且广泛应用于跨平台软件开发的框架。它提供了丰富的工具和库,可用于开发高质量、 高效率的图形用户界面(GUI)应用程序。并且可以在 Windows、linux、macOS 等多种操作系统上 运行。随着行业的发展,Qt的重要性也逐渐体现出来。

搭建 Qt 开发环境

Qt 的开发工具概述

Qt 支持多种开发工具,其中比较常用的开发工具有:Qt Creator、Visual Studio、Eclipse

Qt Creator

Qt Creator 是一个轻量级的跨平台集成开发环境(IDE),专为使用 Qt 框架进行应用程序开发而设 计。

它是一个功能强大、易于使用、快速且高效的工具,被广泛用于编写各种类型的应用程序,如桌面应 用程序、移动应用程序和嵌入式系统等。

Qt Creator 提供了一个可视化的界面设计器和代码编辑器,可以帮助开发者更快捷地创建复杂的用户 界面和处理各种事件。

它还包含了调试工具、版本控制工具、自动完成和智能提示等功能,以及支持多语言和跨平台的开发 环境。

Qt Creator 的主要特点包括:

  • 紧密集成的 Qt 框架:Qt Creator 专门为 Qt 开发而设计,因此它与 Qt 框架集成得非常紧密,使开 发者可以更容易地管理和部署他们的应用程序。
  • 强大的编辑器:Qt Creator 具有一些先进的编辑器功能,如语法高亮、代码折叠、智能提示、自动 完成和代码重构。
  • 集成的调试器:Qt Creator 内置了调试器,允许开发人员在代码中设置断点以及检查变量、堆栈和 调用树等信息。
  • 高效的构建系统:Qt Creator 提供了一个高效的构建系统,可以自动构建和部署应用程序,同时支 持使用不同的编译器和平台。
  • 可视化界面设计器:Qt Creator 具有一个可视化界面设计器,它允许开发人员在没有编写代码的情 况下创建复杂的用户界面。
  • 多语言支持:Qt Creator 支持多种编程语言,包括 C++、QML、JavaScript 等。

总而言之,Qt Creator 是一个功能齐全、易于使用且高效的跨平台 IDE,适用于各种类型的应用程序开 发,特别是那些使用 Qt 框架的开发者。

Visual Studio

Visual Studio 是由微软公司开发的集成开发环境(IDE)。它可以用来开发多种类型的应用程序。包括 Windows 桌面应用程序、Web应用程序、移动应用程序、游戏等。Visual Studio 提供了丰富的开发工 具和功能,包括代码编辑器、调试器、自动完成、代码重构、版本控制等等。它支持多种编程语言, 如:C++、C#、Visual Basic、F#、Python等。Visual Studio 还可以与其他开发工具和服务集成,如 Azure 云服务、GitHub、Jenkins等。

Eclipse

Eclipse 是著名的跨平台的自由集成开发环境(IDE)。最初主要用来 Java 语言开发,但是目前亦有人 通过插件使其作为其他计算机语言比如 C++ 和 Python 的开发工具。Eclipse 的本身只是一个框架平 台,但是众多插件的支持使得 Eclipse 拥有其他功能相对固定的 IDE 软件很难具有的灵活性。许多软件 开发商以 Eclipse 为框架开发自己的 IDE。Qt 框架可以与 Eclipse 集成,使开发者可以使用 Eclipse 的 强大功能来开发 Qt 应用程序。

Qt SDK 的下载和安装

Qt 下载官网:http://download.qt.io/archive/qt/

国内清华源: https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/

下载需要安装的版本即可

Qt SDK 的安装

找到下载的文件并双击;注意:在双击之前先断网,否则需要我们注册 Qt 账号登录后才能进入下 一步安装;

选择安装路径时不能出现中文路径,否则即使安装上也无法使用;

后面一路next即可。

环境变量配置

为什么要设置环境变量?

环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序将要使 用到的信息。

例如Windows 和 DOS 操作系统中的 path 环境变量,当要求系统运行一个程序而没有告诉它 程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还会到 path 中指定的路径 去找。

使用 Qt Creator 新建项目

新建项目

打开 Qt Creator ,在菜单栏中选中: "文件" --------> "新建文件或项目" ;或者使用快捷键:Ctrl + n;或者直接点击:"new";

选择项目模板

新建项目对话框里有五类项目模板:

常用的只有第一类 Application,选择它,在右侧会看到 Qt 应用程序的五个子模板:

  • Qt Widgets Application:普通窗体模板,传统基于部件的窗体界面程序。
  • Qt Console Application:Qt 控制台应用程序。因为 Qt 主要用于图形界面设计,这个控制台项目 模板基本不用。
  • Qt for Python:在Python下用 LGPL 的许可来开发闭源 Qt 软件。
  • Qt Quick Application: Qt 提供的一种高级用户界面技术,使用它可以方便快速的为移动以及嵌入 式设备开发流畅美观的用户界面。Qt Quick 模块是开发 QML 应用的标准库,提供了使用 QML 创建 用户界面所需的一切,包括可视化、交互、动画、模型、视图、粒子效果以及着色效果等。

选择项目路径

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

选择构建系统

Qt 中的构建工具有三种可供选择,分别是:qmake、CMake、Qbs,下面依次介绍。

  • qmake: qmake 是一个构建工具(build tool),用于自动生成 makefile 文件。qmake 支持跨平 台构建。qmake 编辑的是一个后缀名为 .pro 的文件。
  • CMake:CMake 是一个跨平台的构建工具。CMake 本身不是一个编译器,其实就是生成一个让编 译器能读懂编译流程的文件工具。让 CMake 自动生成构建系统,例如 Makefile 和 Visual Studio 项目文件。CMake 是一个第三方工具,有自己的文档。
  • Qbs:Qbs(Qt Build Suite:Qt构建套件)同 qmake、CMake 一样都是构建工具。Qbs 号称是新 一代的构建工具,比 qmake 编译速度更快。Qbs 没有绑定 Qt 版本,它从项目文件的高级项目描述 中生成一个正确的依赖表。而传统的 MakeFile 生成工具如 qmake 和 CMake ,其在生成 MakeFile 文件后将实际的命令交给 Make 工具去执行。

填写类信息设置界面

对于基类的选择,目前有三种基类:

上述三个类之间的关系如下图:

选择语言和翻译文件

此处选择的语言是 "汉语", "英语" 这样的语言. 而不是 "编程语言“。由于我们暂时不考虑国际化问题, 直接下一步即可.

选择 Qt 套件

默认只有第一个 "Desktop Qt 5.14.2 MinGW 64-bit",如果安装配置了多个 Qt 套件,就可以都选上。 Qt 套件是指 Qt 程序从编译链接到运行环境的全部工具和 Qt 类库的集合,对于 MinGW 版本 Qt 程序生 成和调试,至少需要 MinGW 中的编译器 g++(自动调用链接器)、g++ 配套的基础库、调试器 gdb 还 有使用 MinGW 环境编译而成的 Qt 类库自身。默认情况下,在上面 Kit Selection 里选中全部套件。

选择版本控制系统

在项目管理界面可以设置作为子项目,以及加入版本控制系统管 理。这两个功能暂时用不到,都用默认的 <None>,然后点击 "完成" 。

如果想把代码提交到码云或者 github, 可以在此处选择 git 作为版本控制系统.

最终效果

项目创建完成之后,Qt Creator 会直接进入代码编辑模式,可以看到类似下图界面:

认识 Qt Creator 界面

左边栏

在编辑模式下,左边竖排的两个窗口叫做 "边栏" 。① 是项目文件管理窗口,② 是打开文件列表窗口。 在 QtCreator 菜单 "控件" -------> "Show Left Sidebar",或者使用快捷键:"Alt + 0" 可以控制边栏的 显示和隐藏。

边栏里的窗口数目可以增加,边栏子窗口标题栏有一排小按钮,最右边的是关闭按钮,倒数第二个是 增加分栏按钮,可以添加多个边栏子窗口。

边栏子窗口标题栏第一个控件是组合框,可以选择该子窗口的功能视图类型,目前可以选择 8 个视图 类型:

代码编辑区

①和②:导航按钮 "返回" 和 "前进",这与网页浏览器的前进和后退按钮类似,可以在之前浏览的多个 代码文件或一个代码文件里多个位置之间快速切换。

③:标识当前显示的文件是只读还是可写,一般都是可写的。

④:文件类型图标,当前显示文件的类型,这个控件其实是一个菜单按钮,点击可以弹出丰富的文件 处理功能菜单。

⑤:打开的文件名,可以在多个打开的文件之间选择切换,与边栏的 "打开文档" 视图是对应的。

⑥:关闭当前显示的文档。

⑦:为当前显示的文件添加额外的C++预处理指令,一般用不着。

⑧:选择符号,可以在当前显示的文件里多个函数、类、成员变量等之前快速切换,与边栏"大纲"视 图是对应的。

⑨:编辑区光标的行号和列号。

⑩:代码编辑区分栏,可以增加多个编辑器窗口,显示多个打开的文档或显示较大源码文件的多个位 置。

行首区:主要用来显示代码行号,以及调试断点标志和代码书签标志。右击行首区可以弹出右键菜 单,菜单里可以切换书签、编辑书签以及设置或取消断点。

同一行是既可以打断点也可以设置书签的,二者不冲突,其实它们根本就没关系。单击行号前面的浅 灰色空白区可以直接打断点,再次单击可以取消断点,另外也可以用快捷键 F9 设置或取消断点。代码 书签一般用右键菜单来设置,也可以用快捷键 Ctrl+M 设置或取消书签。

编辑区:写代码的区域。

UI设计界面

双击 widget.ui 文件,Qt Creator 会自动进入设计模式,可以对图形界面进行可视化编辑:

①:组件选择窗口。组件选择窗口分为多个组,如 Layouts、Buttons、Display Widgets 等,界面设 计的常见组件都可以在组件选择窗口中找到。

②:UI 设计窗口。如果要将某个组件放置到该窗口上时,从组件选择窗口上拖放一个组件到窗体上即 可。

③:动作编辑窗口。动作编辑窗口包括 Action Editor 以及 Signals 和 Slots 编辑器。 Action Editor 主 要是用来新建 Action,并且通过拖拽的动作,将新建好的 Action 添加到菜单栏和工具栏上;Signals 和 Slots 编辑器用于可视化地进行信号与槽的关联。

④:对象浏览窗口。用树状视图显示窗体上各组件之间的布局包含关系,视图有两列,显示每个组件 的对象名称(ObjectName)和类名称。

⑤:属性设置窗口。显示某个选中的组件或窗体的各种属性及其取值,可以在属性设置窗口里修改这 些属性的值。

构建区

左下角一共有四个按钮,下面分别介绍一下:

  • 第一个按钮是选择构建项目使用的 Qt 套件和构建目标程序的类型(Debug 或 Release)。 对于第一个按钮,默认的是Debug,构建的是 Debug 类型的目标程序。如果需要构建 Release 版目标 程序,点开左下角第一个按钮:

这里有三种构建模式:

  • 第二个是运行按钮,快捷键是 Ctrl+R,如果还没构建项目或刚修改了代码,直接点击运行的话, QtCreator 会自动构建生成新的目标程序并运行。
  • 第三个是调试按钮,快捷键是 F5。调试程序之前,QtCreator 会自动构建生成最新的目标程序,并 进入调试模式。
  • 第四个是构建按钮,快捷键是 Ctrl+B,只构建最新的目标程序,但不运行。

项目文件解析

.pro 文件解析

工程新建好之后,在工程目录列表中有一个后缀为 ".pro" 的文件, ".pro" 文件就是工程文件 (project) ,它是 qmake 自动生成的用于生产 makefile 的配置文件。如图所示:

".pro" 文件的写法如下:

  1. 注释:从 "#" 开始,到这一行结束。
  2. QT += core gui // Qt 包含的模块 Qt5 包含的模块如下图所示:

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

4. 指定生成的应用程序名:TARGET = QtDemo

5. TEMPLATE = app //模板。告诉 qmake 为这个应用程序生成哪种 makefile。下面是可供选择的模 板:

  • app:建立一个应用程序的 makefile。这是默认值,所以如果模板没有被指定,这个将被使 用。
  • lib :建立一个库的 makefile。
  • vcapp:建立一个应用程序的 VisualStudio 项目文件。
  • vclib: 建立一个库的 VisualStudio 项目文件。
  • subdirs:这是一个特殊的模板,它可以创建一个能够进入特定目录的 makefile 并且为它调用 make 的 makefile。

6. 工程中包含的源文件:SOURCES += main.cpp/widget.cpp

7. 工程中包含的头文件:HEADERS += widget.h

8. 工程中包含的资源文件:RESOURCES += painter.qrc

9. 工程中包含的 "ui" 设计文件:FORMS += widget.ui

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

widget.h 文件解析

在Qt中,如果要使用信号与槽(signal 和 slot)的机制 就必须加入 Q_OBJECT 宏;

Ui::Widget *ui; 这个指针是用前面声明的 namespace Ui 里的 Widget 类定义的,所以指针 ui 是指向 可视化设计的界面,后面要访问界面上的组件,都需要通过这个指针 ui 去访问。

main.cpp 文件解析

使用 Qt Creator 新建任意工程之后,main.cpp 文件中都会自动生成如下代码:

解释:

  1. Qt 系统提供的标准类名 声明头文件没有 .h 后缀;
  2. Qt 一个类对应一个头文件,类名 就是 头文件名;
  3. QApplication 为应用程序类;QApplication a;(a为应用程序对象,有且仅有一个。)
    1. QApplication 管理图形用户界面应用程序的控制流和主要设置。
    2. QApplication 是 Qt 的整个后台管理的命脉。它包含主事件循环,在其中来自窗口系统和其它 资源的所有事件处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。
    3. 对于任何一个使用 Qt 的图形用户界面应用程序,都正好存在一个 QApplication 对象,而不论 这个应用程序在同一时间内是不是有 0、1、2 或更多个窗口          
  4. myWidget w; //实例化窗口对象
  5. w.show(); //调用show函数显示窗口
  6. a.exec() :程序进入消息循环,等待对用户输入进行响应。这里 main()把控制权转交给Qt,Qt 完 成事件处理工作,当应用程序退出的时候 exec() 的值就会返回。在 exec() 中,Qt 接受并处理用户 和系统的事件并且把它们传递给适当的窗口部件。

widget.cpp 文件解析

widget.cpp 文件是类 Widget 的实现代码,所有在窗体上要实现的功能添加在此文件中;

widget.ui 文件解析

widget.ui 是窗体界面定义文件,是一个 XML 文件,定义了窗口上的所有组件的属性设置、布局,及 其信号与槽函数的关联等。用 UI 设计器可视化设计的界面都由 Qt 自动解析,并以 XML 文件的形式保 存下来。在设计界面时,只需在 UI 设计器里进行可视化设计即可,而不用管 widget.ui 文件是怎么生 成的。

Qt 编程注意事项

Qt 中的命名规范

  • 类名:首字母大写,单词和单词之间首字母大写;
  • 函数名及变量名:首字母小写,单词和单词之间首字母大写;

Qt Creator 中的快捷键

  • 注释:ctrl + /
  • 运行:ctrl + R
  • 编译:ctrl + B
  • 字体缩放:ctrl + 鼠标滑轮
  • 查找:ctrl + F 
  • 整行移动:ctrl + shift + ⬆/⬇
  • 帮助文档:F1
  • 自动对齐:ctrl + i;
  • 同名之间的 .h 和 .cpp 的切换:F4
  • 生成函数声明的对应定义: alt + enter

使用帮助文档

打开帮助文档有三种方式. 实际编程中使用哪种都可以.

1、光标放到要查询的类名/方法名上, 直接按 F1

2、Qt Creator 左侧边栏中直接用鼠标单击 "帮助" 按钮:

点击 "帮助" 之后,出现如下图示界面:

3、找到 Qt Creator 的安装路径,在 "bin" 文件夹下找到 assistant.exe,双击打开;

使用示例

1、新建项目,在新建的项目中使用 Qt 中的 "QpushButton" 控件。

2、打开帮助手册,在 "索引" 里面输入 "QpushButton";

Qt Hello World 程序

可视化操作实现

拖拽 "标签" 至 UI 设计界面中,并双击修改标签内容;

运行后效果如上图

纯代码方式实现

上面的代码在qt中不会产生内存泄漏,label对象会在合适的时候被析构释放。

之所以能够把对象释放掉,主要是因为把这个对象挂到了对象树上 。

上面通过new的方式创建对象,也就是为了把这个对象的生命周期,交给qt的对象树来统一管理。

完成hello world可以通过多种控件实现

比如还能用单行编辑框QLineEdit,多行编辑框QTextEdit。使用方法跟前面的label一样。

这里在介绍一下button按钮实现

直接通过拖拽然后双击输入文本实现。下面再用代码控制按钮的事件

connect函数跟qt中信号槽机制有关。

本质是给按钮的点击操作,关联上一个处理函数。

参数1:ui->pushButton:访问到from file(ui文件)中创建的控件。(谁发出的信号)

qmake在预处理.ui文件的时候,会根据这里的objectName生成对应的C++代码,c++代码中该QPushButton对象的变量名就是这里的objectName。这个变量就是ui属性中的成员变量。

参数2:点击按钮的时候会自动触发这个信号。(发出了什么信号)

参数3:谁来处理这个信号

参数4:具体怎么处理

点击运行结果如图,然后再点击按钮,发生了文本替换。

但这样写的话,只能点击一次变成hello qt

如上图,这样写的话,如果是hello world就变成hello qt,如果不是就变成hello world。这样就可以一直点击来切换了。

上面是通过图形化界面实现的,下面是纯代码实现的。

比较一下二者的差别。纯代码版本,按钮对象是自己new的,为了保证其他函数中能够访问这个变量,就需要把按钮对象设定为Widget类的成员变量。

图形化界面版本,不需要自己new,new对象的操作已经被qt自动生成了,而且这个对象已经作为ui对象里的一个成员变量了。也无需作为Widget的成员。

认识对象模型(对象树)

在 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对象树如图:

代码示例

完成后,手动创建类的头文件以及源文件会自动添加到目标工程中;

编译并运行:

因为把MyLabel挂到了对象树上,所以关闭窗口的时候,会自动销毁对象树中所有的对象。

这里销毁后,发现打印的日志是乱码。

这是因为编码方式不同。

这里不适用std::cout,而是使用qDebug()。

Qt中提供了一个qDebug()工具,借助这个可以完成打印日志的过程,很好的处理字符编码。可以把他当cout使用

Qt 窗口坐标体系

坐标体系:以左上角为原点(0,0),X向右增加,Y向下增加。

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

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

结果如下图:

Widget的父元素就是整个桌面,所以运行后,窗口会在屏幕左上角显示:

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务

更多推荐