Qt基础
Qt基础
xingzhuQT 概述
模块 | 功能 |
---|---|
Qt Core | Qt 类库的核心,所有其他模块都依赖于此模块 |
Qt GUI | 设计 GUI 界面的基础类,包括 OpenGL |
Qt Widgets | 用于构建 GUI 界面的 C++ 图形组件类 |
创建一个项目都会自动添加上述模块
注意点
- QtCreator 创建的
项目名称
不能包含中文,不能包含空格,项目目录
也不能含中文 - QtCreator 默认使用
UTF-8
格式编码对文件字符进行编码
创建项目
创建完后的
项目文件(. pro)
1 | 在项目文件中, 注释需要使用 井号(#) |
main.cpp
1 |
|
mainwindow.ui
1 | <!-----以文本编辑器打开,会找到这样一行代码--> |
mainwindow.h
1 |
|
mainwindow.cpp
1 |
|
- 因此
mainwindow.h
,mainwindow.cpp
,mainwindow.ui
可以堪称是一个整体,是用两个同名对象关联
窗口类
QWidget
- 父类是
QObject
- 所有窗口类的基类
- Qt 中的控件 (按钮,输入框,单选框…) 也属于窗口, 基类都是
QWidget
- 可以内嵌到其他窗口中,没有边框
- 可以不内嵌单独显示,独立的窗口, 有边框
- 父类是
QDialog
- 对话框类,继承
QWidget
- 模态和非模态两种显示方式
- 不能内嵌到其他窗口中
- 对话框类,继承
QMainWindow
- 是专门设计用作应用程序的主窗口的类,它继承自
QWidget
,但提供了更高级的功能和布局。 - 它有内置的支持,用于管理常见的主窗口元素,比如菜单栏 (
QMenuBar
)、工具栏 (QToolBar
)、状态栏 (QStatusBar
)、和中央窗口区 (centralWidget
) - 不能内嵌到其他窗口中
- 是专门设计用作应用程序的主窗口的类,它继承自
QWidget 窗口显示
1 | // MainWindow 是自己创建项目取的名字 |
- 这个就是显示两个独立窗口
- 一个是创建
MainWindow
对象时,Qt 框架会自动创建一个基本的窗口,因为MainWindow
继承于QMainWindow
,然后main()
函数中调用show
方法,窗口显示 - 一个是自定义的
TestWidget
窗口,由于没有设置父亲,单独显示,但前提是调用show()
方法
1 | // 和上面其他一致,就定义不同 |
- 这个就是只显示一个窗口,只显示
MainWindow
窗口,TestWidget
窗口内嵌在了父窗口里面 - 这是设置了父亲的显示,不是独立窗口
QDialog 窗口
QDialog
窗口都是独立作为一个窗口显示,都需要调用show
方法,不管是否设置父亲
1 | // 非模态 |
- 调用
show()
方法就是非模态显示,焦点即我们的鼠标可以
随意切换到任意一个窗口
1 | // 将上面的 show 方法变成 exec 方法,变成模态 |
- 此时就是模态显示
- 焦点即我们的鼠标
不可以
随意切换到任意一个窗口,只能点击当前的QDialog
窗口 - 它还会阻塞程序的执行,也就是将程序阻塞到当前位置,这里的显示就是
MainWindow
窗口一直不显示,因为调用是在main
函数里,程序确阻塞在这里 - 只有关闭
QDialog
窗口之后,才能够焦点随意切换,MainWindow
窗口显示出
QPushButton
创建
1 | // 创建按钮 |
显示
1 | // 显示文本 |
对象树
上面代码中,很容易发现我们 new 出来对象,却没有去手动释放,这就是对象树的功劳
基本概念
- 在 Qt 中,大多数对象(特别是那些继承自
QObject
的类)都可以有一个父对象和多个子对象 - 父对象与子对象之间形成了一种层次结构,称为对象树
- 当你创建一个 Qt 对象并指定一个父对象时,新的对象会自动被添加到父对象的子对象列表中
1 | QPushButton *btn = new QPushButton(this);` |
- 这行代码会创建一个
QPushButton
对象,并将其添加到this
即当前窗口的子对象列表中 - 对象树由 Qt 自动维护,通常不需要手动管理它
图例:
创建顺序从上到下,很好理解,析构反着来,可以用栈知识理解,先进后出 由对象树也能得出一个结论,创建出的类对象必须设置父对象
功能
内存管理
- Qt 的对象树结构自动管理对象的内存
- 当一个父对象被销毁时,它的所有子对象也会被自动销毁,这就意味着你不需要手动删除每一个子对象,这大大减少了内存泄漏的风险
- 例如,当你关闭一个窗口时,窗口中的所有控件(如按钮、标签等)会被自动销毁
事件传播
- Qt 中的事件(如鼠标点击、键盘输入等)会沿着对象树的层次结构传播
- 通常,事件会首先发送到目标对象(如按钮),如果目标对象未处理该事件,则事件会传递给其父对象,直到顶层对象(如窗口)
- 这种机制允许你在父对象中统一处理某些事件,而不需要在每个子对象中重复代码
坐标体系
- 坐标原点是左上角即为 (0, 0),X 向右递增,Y 向下递增
- 每个窗口的坐标体系规则是根据父窗口,注意不是顶级父类,是上一个父类,如上图的(10, 10) 是相对于 (0, 0) 的坐标,而 (20, 20) 是相对于 (10, 10) 的坐标,也就是以 (10, 10) 为起点往右 20 像素和往下 20 像素
- X 即为宽,Y 即为高
示例一个层层套娃
1 | MainWindow::MainWindow(QWidget *parent) |
效果:
说明:参考 https://subingwen.cn/
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果