【Qt】初识Qt

一、Qt Creator 工具的介绍

Qt是一个跨平台的C++图形用户界面应用程序框架。

Qt工具

  • Qt Assistant(Qt助手)
  • Qt Desiginer(Qt设计师)
  • Qt Example and Dmeos(Qt演示程序与案例)
  • Qt Linguist(Qt语言)

二、一个Qt项目的创建与代码解析

2.1 项目创建

当你打开Qt,点击编辑模式你会看见下面的内容。

点击文件,点击新建文件或项目,让我们开始第一个Qt项目吧。

点击第一个,来到下面这个界面

点击下一步

这里我们选择qmake就好,点击下一步

QMianWindow(主窗口类):完整的应用程序窗口(可以包含工具栏、菜单栏、状态栏... ...)

QWidget(可视界面类):创建界面对各种界面组件都可以支持

QDialog(对话框类):创建工程基于对话框的界面

Form file也是非常重要的,因为Qt中创建图形化界面的程序,有两种方式:

1、直接通过C++代码的方式创建界面。

2、通过Form file,以图形化的方式来生成界面

此时,就可以使用Qt Designer或者直接使用Qt Creator来编辑这个ui文件,从而以图形化的方式快速方便的生成图形化界面

点击下一步

这里是选择翻译文件(对应的语言),与国际化相关,此处我们不研究。

点击下一步

选择一下基于哪个编译器的Qt SDK来构建后续代码

最后点击下一步,点击完成。我们就创建完成了。

2.2 代码解析

直接双击ui文件,此时Qt Creator就会调用Qt Designer,打开ui文件。图形化的界面编辑器

此时再点击左侧的编辑模式,就是.ui的文本内容了

这个格式称为xml格式

xml与html十分相似,都是使用成对的标签来表示数据

xml这里的标签,有哪些标签,都是什么含义,是由程序员自定义的。此处看到的标签都是开发Qt的大佬来约定的

Qt中使用xml文件就是来描述程序的界面的样子的。进一步的qmake会调用相关的工具,依据这个xml文件生成一些C++的代码,从而把完整的界面构造出来

.pro文件,也是qmake工具构建时的重要依据

在编译运行的过程还会生成一些中间文件。我们打开文件资源管理器,看看对应的目录是什么样子的。

我们发现在运行一次之后会生成一个build-XXX的目录。这个目录里就是运行过程中生成的一些临时文件

我们来看一下这个目录里面的内容

其实编译Qt程序也是会用到Makefile,不过是由qmake自动生成的.

我们打开最后一个文件。这个文件是xml生成的.h文件

三、创建第一个有内容的运行程序

两种方式

  1. 通过图形化的方式,在界面上创建一个控件,显示要实现的内容
  2. 通过纯代码的方式,编写代码,在界面上创建控件,显示要显示的内容

这里我们选择QWidget来完成

3.1 图形化方式

(一)双击"widget.ui"文件

(二)拖拽控件至ui界面窗口并修改内容

(三)构建并运行,效果如下

3.2 纯代码方式

结果如下所示

注意:

在创建对象时,我们可以在堆上创建,也可以在栈上创建。这里推荐在堆上创建。

四、对象树

在Qt中创建很多对象的时候会提供⼀个Parent对象指针,下⾯来解释这个parent到底是干什么的。

  • QObject是以对象树的形式组织起来的
  • 当创建⼀个QObject对象时,会看到QObject的构造函数接收⼀个QObject指针作为参数,这 个参数就是parent,也就是父对象指针
  • 这相当于,在创建QObject对象时,可以提供⼀个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表
  • 当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承 意义上的父类!)

QWidget是能够在屏幕上显示的一切组件的父类。QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。我们也可以自己删除子对象,它们会自动从其父对象列表中删除
对象树在⼀定程度上解决了内存问题。

  • 当⼀个QObject对象在堆上创建的时候,Qt会同时为其创建⼀个对象树。不过,对象树中对象的 顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。
  • 任何对象树中的QObject对象delete的时候,如果这个对象有parent,则自动将其从parent的children()列表中删除;如果有孩子,则自动delete每一个孩子。Qt保证没有QObject会被delete两次,这是由析构顺序决定的

上面我们说推荐在堆上建立堆上,而不是栈上。这是为什么呢?下面我们就可以解释了。

在上面的代码中,作为父对象的window会首先被析构,因为它是最后⼀个创建的对象。在析构过程中,它会调用子对象列表中每⼀个对象的析构函数,也就是说,quit此时就被析构了。然后代码继续执行,在window析构之后,quit也会被析构(因为quit也是⼀个局部变量,在超出作用域也需要析构)。但是,这时候已经是第二次调用quit的析构函数了,C++不允许调用两次析构函数,因此,程序崩溃了。

所以,在Qt中,尽量在构造的时候就指定parent对象,并且大胆在堆上创建

相关推荐
星火撩猿2 小时前
OpenCv实战笔记(1)在win11搭建opencv4.11.1 + qt5.15.2 + vs2019_x64开发环境
笔记·qt·opencv
chao_7894 小时前
QT开发工具对比:Qt Creator、Qt Designer、Qt Design Studio
开发语言·qt
秋风&萧瑟5 小时前
【QT】QT中的网络编程(TCP 和 UDP通信)
网络·qt·tcp/ip
feiyangqingyun6 小时前
Qt/C++源码/实时视音频通话示例/极低延迟/可外网通话/画中画/支持嵌入式板子
c++·qt·qt视音频通话
秋风&萧瑟6 小时前
【QT】QT中http协议和json数据的解析-http获取天气预报
qt·http·json
珊瑚里的鱼6 小时前
LeetCode 102题解 | 二叉树的层序遍历
开发语言·c++·笔记·算法·leetcode·职场和发展·stl
码上飞扬6 小时前
Java大师成长计划之第12天:性能调优与GC原理
java·开发语言
Wabi_sabi_x6 小时前
C++设计模式:面向对象的八大设计原则之一
开发语言·c++·设计模式
万叶学编程7 小时前
鸿蒙移动应用开发--ArkTS语法进阶实验
开发语言·javascript·ecmascript