QWidget:
控件基类:
- Qt 内置的父类—QObject
- 控件的基类(QObject 派生类): QWidget
- QWidget 派生了两个派生类(工程模板): QMainwindow、 QDialog
- QMainwindow 适合做一些桌面应用: keil VScode QDialog 对话框
UI文件:
Qt 项目中,后缀为“.ui”的文件是可视化设计的窗体的定义文件,如 widget.ui。双击项目文件目录树中的文件 widget.ui,会打开一个集成在 Qt Creator 中的 Qt Designer 对窗体进行可视化设计


注意:
- 一旦使用系统自带的信号和槽:不需要自己写 connect。
- 如果使用到自定义信号、自定义的槽, ui 工具将无能为力。
资源文件:
- 在 Qt 中,资源文件(Resource Files)是一种用于管理应用程序中的静态资源的机制。这些资源可以包括图像、音频、文本文件等。
- Qt 资源文件使用后缀名为.qrc,是一种 XML 格式的文件,通过将这些资源打包成二进制文件,可以方便地集成到应用程序中,无需单独处理这些文件。
布局方式:
布局方式时 Qt 提供的一种工具(弹簧) —设计好的界面可以自由拉升,而不变形空间构思能力。

设计师界面类:
- Qt 设计师界面类,是 Qt 框架中用于分离界面设计与业务逻辑的重要机制,通过可视化工具 Qt Designer 创建的 .ui 文件生成。
QMainWindow:
QMainWindow 基本介绍:
QMainWindow(QWidget 的子类),提供了一个主应用程序窗口。
窗口为构建应用程序的用户界面提供了一个框架。 Qt 有 QMainWindow 及其相关的主窗口管理类。
QMainWindow 有自己的布局,可以在其中添加 QToolBar(可添加多个)、 QDockWidget (可添加多个)、 QMenuBar 和 QStatusBar。布局有一个中心区域,可以被任何类型的小部件占据。
QMainWindow 构成:
一个菜单栏(menu bar) :位置固定,最多有一个,内部子对象只能是菜单项
多个工具栏(tool bars):位置不固定,数量无上限,内部子对象只能是菜单项
多个铆接部件(dock widgets):位置不固定,数量无上限,内部可以有任意类型的子对象
一个状态栏(status bar):位置固定,最多有一个,没有子对象
一个中心部件(central widget):位置固定,最多有一个,内部可以有任意类型的子对象

MDK ARM示例:

菜单栏与菜单项(QMenuBar、 QAction):
- 一个主窗口最多只有一个菜单栏。位于主窗口顶部、 主窗口标题栏下面。
- 菜单栏可以存储一些整个系统需要的工具、选项:打开文件、新建工程、视图选择、软件配置。
- 菜单栏的构造:
- 菜单栏
- 可以有多个菜单
- 每个菜单下可以有多个菜单项
- 操作步骤:
- 先创建菜单栏
- 创建菜单,并将添加到菜单栏下
- 创建菜单项,并将其添加到对应的菜单下
工具栏(QToolBar):
- 主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的的方式,也可根据需要进行工具条的划分。
- 需要加头文件 #include
状态栏(QStatusBar):
- 派生自 QWidget 类,使用方法与 QWidget 类似, QStatusBar 类常用成员函数状态栏也只能最多有一个
中心部件(setCentralWidget):
- 中心显示的部件都可以作为核心部件,例如一个记事本文件,可以利用 QTextEdit 做核心部件
铆接部件(QDockWidget):
- 铆接部件 QDockWidget,也称浮动窗口,可以有多个
- 中心部件与铆接部件内部可以使用任意的控件替代:可以是文本编辑器、表格、树形图…….
对话框QDialog:
对话框概述:
我们有的时候打开某些网站,不经意间可能就会弹出各种奇奇怪怪的窗口,这个就可以叫做“对话框”,对话框往往在用户与用户之间进行“短平快” 的操作。
对话框是 GUI 程序中不可或缺的组成部分。 一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。
Qt 常用的内置对话框有:
QMessageBox(消息框)
QColorDialog(颜色对话框)
QFontDialog (字体对话框)
QInputDialog(输入对话框)
QFiledialog(文件对话框)

QDialog 也是 QWidget 的派生类。
对话框主要可以分为模态对话框和⾮模态对话框:
- 模态对话框指的是:显示后无法与父窗口进行交互,是一种阻塞式的对话框。使用QDialog::exec()函数调用。
- 非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用 QDialog::show()函数调用。
常用控件应用扩展:
QLabel 文本、图片、动图设置
- QLabel 类:文本标签,可以容载文本、图片、动图(作为载体)
自定义控件:
- 具体操作如下:
- 创建一个新的 Form
- 设计好新创建的 Form
- 设计原有的 Form, 添加一个容器
- 将容器的某一页提升为自定义控件
- 将页面提升为新类(新 Form)
信号机制与事件:
事件概述:
事件是应用程序内部或者外部产生的事情或者动作的统称。
事件的引入:
- 事件与信号槽非常类似:用户进行的各种操作,会产生事件。开发人员可以给事件关联上处理函数,当事件触发的时候,就能够执行到对应的代码。
- 事件本身是操作系统提供的机制。 Qt 也同样把操作系统事件机制进行了封装。但是由于事件对应的代码编写起来不是很方便。 Qt 对于事件机制又进行了进一步的封装,就得到了信号槽。然而值得注意的是—信号槽就是对于事件的进一步封装, 事件是信号槽的底层机制。
- 实际 Qt 开发程序过程中,绝大部分和用户之间进行的交互都是通过“信号槽”来完成的。有些特殊情况下,信号槽不一定能搞定某个用户的动作行为, Qt 没有提供对应的信号。 此时就需要通过重写事件处理函数的形式,来手动处理事件的响应逻辑。
Qt 中的事件:
在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。
当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件是在用户操作时发出,如键盘事件、鼠标事件等,另一些事件则是由系统本身自动发出,如定时器事件。
常见的 Qt 事件如下:

事件的处理:
事件处理一般常用的方法为: 重写相关的 Event 函数。 在 Qt 中,几乎所有的 Event 函数都是虚函数,所以可以重新实现。
如:在实现鼠标的进入和离开事件时,直接重新实现 enterEvent()和 leaveEvent()即可。
一个事件有 APP 传递到代码层的逻辑:

鼠标事件:
- 在 Qt 框架中,处理鼠标事件是创建交互式图形用户界面的关键部分。鼠标事件包括鼠标点击、双击、移动、滚轮滚动等。这些事件由 QMouseEvent 类表示,它提供了关于鼠标事件的详细信息,如鼠标位置、按钮状态等。
- 在 widget.ui 创建一个 QLabel, 并提升为新类(基类为 QLabel)
事件分发器:
- Qt 拦截消息的五种方法:
- 重写框架类 QCoreApplication 的 notify 函数,这个函数将得到整个框架中所有窗口的消息
- 给框架类安装一个事件过滤器
- 给某窗口安装一个事件过滤器
- 继承某窗口并覆写事件分发器 event 函数(该函数负责某个窗口中派发所有子消息)
- 继承某窗口并重写窗口的某个子消息(鼠标进入、 退出、 点击、 键盘点击)
- 在 Qt 中,事件分发器(EventDispatcher)是一个核心概念,用于处理 GUI 应用程序中的事件。
- 事件分发器负责将事件从一个对象传递到另一个对象,直到事件被处理或被取消。
- 每个继承自 QObject 类或 QObject 类本⾝都可以在本类中重写 event 函数,来实现相关事件的捕获和拦截。
- 在 Qt 中,我们发送的事件都是传给了 QObject 对象,更具体点是传给了 QObject 对象的 event()函数。所有的事件都会进入到这个函数里面,那么我们处理事件就要重写这个event()函数。 event()函数本身不会去处理事件,是而根据事件类型(type 值)调用不同的事件处理函数。
- 如果事件在一个类中未被处理, Qt 会继续将事件传递给父对象或下一个事件过滤器(如果有的话)。如果事件最终没有被任何对象处理,它会被传递给默认的事件处理机制。
- 当事件已被处理, Qt 会停止事件的进一步传播。
- Qt 拦截消息的五种方法:
事件过滤器:
- 事件过滤器是在应用程序分发到 event 事件分发器之前,再做一次更高级的拦截。
- 每个设备默认没有事件过滤器, 需要安装+重写
绘图系统与 paintEvent 事件:
Qt 的绘图系统类似于 MCU 单片机的 LCD 裸机开发(区别于 STemWin、 LVGL) —基于一个画点函数(坐标、 颜色)
Qt 的绘图系统允许使用相同的 API 在屏幕和打印设备上进行绘制。整个绘图系统基于QPainter、 QPainterDevice 和 QPaintEngine 三个类。
- QPainter(画家) 用来执行绘制的操作
- QPaintDevice(画板) 是一个二维空间的抽象,这个二维空间可以由 QPainter 在上面进行绘制
- QPaintEngine(画笔) 提供 painter 在不同的设备上进行绘制的统一的接口
Qt 的绘图系统实际上是说,使用 QPainter 使用画笔画刷等工具在QPainterDevice 上面进行绘制,它们之间使用 QPaintEngine 引擎进行通讯。
