【QT】认识QT
文章目录
- 1. 认识Qt
- 2. 创建QT项目
- 3. 认识对象树
- 4. 其它
- 4.1 窗口坐标系
- 4.2 快捷键

1. 认识Qt
- 什么是QT
Qt 是⼀个跨平台的C++图形用户界⾯应用程序框架。
- 它为应用程序开发者提供了建立艺术级图形界⾯所需的所有功能。
- 它是完全⾯向对象的,很容易扩展。
- Qt为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的应⽤程序,同时也可以使用C++语言进行高级开发
图形⽤⼾界⾯:指采⽤图形⽅式显⽰的计算机操作⽤⼾界⾯,是计算机与其使⽤者之间的对话接⼝,是计算机系统的重要组成部分
- Qt的优点
- 跨平台,⼏乎⽀持所有的平台;
- 接口简单,容易上手,学习QT框架对学习其他框架有参考意义。
- ⼀定程度上简化了内存回收机制;
- 开发效率⾼,能够快速的构建应⽤程序。
- 有很好的社区氛围,市场份额在缓慢上升。
- 可以进行嵌入式开发
- Qt的应用场景
- 桌面应用程序
Qt 能够创建各种类型的桌⾯应⽤程序,包括⽂件管理器、媒体播放器、绘图程序等。Qt应⽤程序⽀持多种操作系统,可以运⾏在Windows、Linux、macOS等桌⾯操作系统上。
- 移动应用程序
Qt ⽀持Android和IOS移动操作系统,为应⽤程序提供了强⼤的跨平台能⼒。可以使⽤Qt构建各种移动应⽤程序,例如社交应用、游戏、娱乐等。
- 嵌⼊式系统
Qt 在嵌⼊式领域应用非常广泛,它可以构建⾯向各种设备的图形应⽤程序,在机顶盒、车载娱乐系统、安防监控设备等领域具有⼴泛的应用。
2. 创建QT项目
-
main.cpp
-
widget.h
-
widget.cpp
-
.pro文件
下面我们就使用QT,创建一个打印hello world的窗口
- 使用Label
- 使用可视化窗口
ui文件中会自动添加
- 使用代码
在上面,我们创建了一个QLabel对象,设置了对象的内容,即可显示出hello world的字符串了
不知道你们时候有这样的疑问:
- 为什么要在堆上开辟,并且传递一个指针
- 未释放空间,会造成内存泄漏吗?
- 在当前widget上创建的对象时,都会传递一个parent指针,将当前创建的对象“挂载”到对象树上
- 树上的对象,最后应该统一被销毁;如果提前销毁了,控件也就不存在了,界面上也就无法显示。如果是在栈上创建的,则会存在提前销毁的情况
下面我们验证一下空间是否会自动析构释放
使用自己的MyLabel,代替原来的QLabel,所谓的继承,本质上是拓展,保持原有的功能不变;给对象拓展出也给析构函数,通过这个析构函数,打印一个自定义的日志,方便观察运行效果。
我们发现确实打印出来了,那就说明析构函数执行了;虽然没有手动delete,但是由于MyLabel挂到了对象树上,当窗口被销毁时,就会自动销毁对象树上的所有对象。
所以在 Qt 中,尽量在构造的时候就指定 parent 对象,并且大胆在堆上创建。
3. 认识对象树
在 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 两次,这是由析构顺序决定的
4. 其它
4.1 窗口坐标系
坐标体系:以左上⻆为原点(0,0),X向右增加,Y向下增加。
对于嵌套窗口,其坐标是相对于父窗口来说的
qDebug() << "this 的坐标为:" << this->x() << " " << this->y();qDebug() << "按钮 的坐标为:" << button->x() << " " << button->y();//this 的坐标为: 500 500
//按钮 的坐标为: 200 200
4.2 快捷键
Qt Creator 中的快捷键
- 注释:ctrl + /
- 运⾏:ctrl + R
- 编译:ctrl + B
- 字体缩放:ctrl + ⿏标滑轮
- 查找:ctrl + F
- 整⾏移动:ctrl + shift + ⬆/⬇
- 帮助⽂档:F1
- ⾃动对⻬:ctrl + i;
- 同名之间的 .h 和 .cpp 的切换:F4
- ⽣成函数声明的对应定义: alt + enter