【Qt】Qt 概述

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

目录

[Qt 背景介绍](#Qt 背景介绍)

[什么是 Qt](#什么是 Qt)

[Qt 支持的平台](#Qt 支持的平台)

[Qt 版本](#Qt 版本)

[Qt 的优点](#Qt 的优点)

[Qt 的应用场景](#Qt 的应用场景)

[Qt 的发展前景及就业分析](#Qt 的发展前景及就业分析)

[搭建 Qt 开发环境](#搭建 Qt 开发环境)

[Qt 的开发工具概述](#Qt 的开发工具概述)

[Qt SDK 的下载和安装](#Qt SDK 的下载和安装)

[Qt SDK 的安装](#Qt SDK 的安装)

环境变量配置

[使用 Qt Creator 新建项目](#使用 Qt Creator 新建项目)

[认识 Qt Creator 界面](#认识 Qt Creator 界面)

项目文件解析

[Qt 编程注意事项](#Qt 编程注意事项)

[Qt Hello World 程序](#Qt Hello World 程序)

认识对象模型(对象树)

[Qt 窗口坐标体系](#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 包含的模块如下图所示:
  1. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 这条语句的含义是,如果 QT_MAJOR_VERSION 大于 4 也就是当前使用的 Qt5 及更高版本) 需要增加 widgets 模块。如果 项目仅需支持 Qt5 , 也可以直接 添加 "QT += widgets" 一句。不过为了保持代码兼容 ,最好还是按照 QtCreator 生成的语句编写。

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

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

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

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

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

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

  5. 配置信息: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的父元素就是整个桌面,所以运行后,窗口会在屏幕左上角显示:

相关推荐
杀死那个蝈坦41 分钟前
Redis 缓存预热
java·开发语言·青少年编程·kotlin·lua
稚辉君.MCA_P8_Java42 分钟前
在Java中,将`Short`(包装类)或`short`(基本类型)转换为`int`
java·开发语言
木易 士心43 分钟前
Node.js 性能诊断利器 Clinic.js:原理剖析与实战指南
开发语言·javascript·node.js
一只乔哇噻43 分钟前
java后端工程师+AI大模型进修ing(研一版‖day59)
java·开发语言·算法·语言模型
报错小能手44 分钟前
C++流类库 概述及流的格式化输入/输出控制
开发语言·c++
2301_789015621 小时前
C++:list(带头双向链表)增删查改模拟实现
c语言·开发语言·c++·list
扣脚大汉在网络1 小时前
关于一句话木马
开发语言·网络安全
学习路上_write1 小时前
FREERTOS_定时器——创建和基本使用
c语言·开发语言·c++·stm32·嵌入式硬件
ExiFengs1 小时前
使用Java 8函数式编程优雅处理多层嵌套数据
java·开发语言·python