QT - 扩展应用

QWidget:

  1. 控件基类:

    1. Qt 内置的父类—QObject
    2. 控件的基类(QObject 派生类): QWidget
    3. QWidget 派生了两个派生类(工程模板): QMainwindow、 QDialog
    4. QMainwindow 适合做一些桌面应用: keil VScode QDialog 对话框
  2. UI文件:

    • Qt 项目中,后缀为“.ui”的文件是可视化设计的窗体的定义文件,如 widget.ui。双击项目文件目录树中的文件 widget.ui,会打开一个集成在 Qt Creator 中的 Qt Designer 对窗体进行可视化设计

      Qt8

      Qt9

    • 注意:

      • 一旦使用系统自带的信号和槽:不需要自己写 connect。
      • 如果使用到自定义信号、自定义的槽, ui 工具将无能为力。
  3. 资源文件:

    1. 在 Qt 中,资源文件(Resource Files)是一种用于管理应用程序中的静态资源的机制。这些资源可以包括图像、音频、文本文件等。
    2. Qt 资源文件使用后缀名为.qrc,是一种 XML 格式的文件,通过将这些资源打包成二进制文件,可以方便地集成到应用程序中,无需单独处理这些文件。
  4. 布局方式:

    • 布局方式时 Qt 提供的一种工具(弹簧) —设计好的界面可以自由拉升,而不变形空间构思能力。

      Qt10

  5. 设计师界面类:

    • Qt 设计师界面类,是 Qt 框架中用于分离界面设计与业务逻辑的重要机制,通过可视化工具 Qt Designer 创建的 .ui 文件生成。

QMainWindow:

  1. QMainWindow 基本介绍:

    1. QMainWindow(QWidget 的子类),提供了一个主应用程序窗口。

    2. 窗口为构建应用程序的用户界面提供了一个框架。 Qt 有 QMainWindow 及其相关的主窗口管理类。

    3. QMainWindow 有自己的布局,可以在其中添加 QToolBar(可添加多个)、 QDockWidget (可添加多个)、 QMenuBar 和 QStatusBar。布局有一个中心区域,可以被任何类型的小部件占据。

    4. QMainWindow 构成:

      1. 一个菜单栏(menu bar) :位置固定,最多有一个,内部子对象只能是菜单项

      2. 多个工具栏(tool bars):位置不固定,数量无上限,内部子对象只能是菜单项

      3. 多个铆接部件(dock widgets):位置不固定,数量无上限,内部可以有任意类型的子对象

      4. 一个状态栏(status bar):位置固定,最多有一个,没有子对象

      5. 一个中心部件(central widget):位置固定,最多有一个,内部可以有任意类型的子对象

        Qt11

      6. MDK ARM示例:

        Qt12

  2. 菜单栏与菜单项(QMenuBar、 QAction):

    1. 一个主窗口最多只有一个菜单栏。位于主窗口顶部、 主窗口标题栏下面。
    2. 菜单栏可以存储一些整个系统需要的工具、选项:打开文件、新建工程、视图选择、软件配置。
    3. 菜单栏的构造:
      1. 菜单栏
      2. 可以有多个菜单
      3. 每个菜单下可以有多个菜单项
    4. 操作步骤:
      1. 先创建菜单栏
      2. 创建菜单,并将添加到菜单栏下
      3. 创建菜单项,并将其添加到对应的菜单下
  3. 工具栏(QToolBar):

    • 主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的的方式,也可根据需要进行工具条的划分。
    • 需要加头文件 #include
  4. 状态栏(QStatusBar):

    • 派生自 QWidget 类,使用方法与 QWidget 类似, QStatusBar 类常用成员函数状态栏也只能最多有一个
  5. 中心部件(setCentralWidget):

    • 中心显示的部件都可以作为核心部件,例如一个记事本文件,可以利用 QTextEdit 做核心部件
  6. 铆接部件(QDockWidget):

    • 铆接部件 QDockWidget,也称浮动窗口,可以有多个
    • 中心部件与铆接部件内部可以使用任意的控件替代:可以是文本编辑器、表格、树形图…….

对话框QDialog:

  1. 对话框概述:

    1. 我们有的时候打开某些网站,不经意间可能就会弹出各种奇奇怪怪的窗口,这个就可以叫做“对话框”,对话框往往在用户与用户之间进行“短平快” 的操作。

    2. 对话框是 GUI 程序中不可或缺的组成部分。 一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。

    3. Qt 常用的内置对话框有:

      1. QMessageBox(消息框)

      2. QColorDialog(颜色对话框)

      3. QFontDialog (字体对话框)

      4. QInputDialog(输入对话框)

      5. QFiledialog(文件对话框)

        Qt13

    4. QDialog 也是 QWidget 的派生类。

    5. 对话框主要可以分为模态对话框和⾮模态对话框:

      1. 模态对话框指的是:显示后无法与父窗口进行交互,是一种阻塞式的对话框。使用QDialog::exec()函数调用。
      2. 非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用 QDialog::show()函数调用。

常用控件应用扩展:

  1. QLabel 文本、图片、动图设置

    1. QLabel 类:文本标签,可以容载文本、图片、动图(作为载体)
  2. 自定义控件:

    1. 具体操作如下:
    2. 创建一个新的 Form
    3. 设计好新创建的 Form
    4. 设计原有的 Form, 添加一个容器
    5. 将容器的某一页提升为自定义控件
    6. 将页面提升为新类(新 Form)

信号机制与事件:

  1. 事件概述:

    1. 事件是应用程序内部或者外部产生的事情或者动作的统称。

    2. 事件的引入:

      1. 事件与信号槽非常类似:用户进行的各种操作,会产生事件。开发人员可以给事件关联上处理函数,当事件触发的时候,就能够执行到对应的代码。
      2. 事件本身是操作系统提供的机制。 Qt 也同样把操作系统事件机制进行了封装。但是由于事件对应的代码编写起来不是很方便。 Qt 对于事件机制又进行了进一步的封装,就得到了信号槽。然而值得注意的是—信号槽就是对于事件的进一步封装, 事件是信号槽的底层机制。
      3. 实际 Qt 开发程序过程中,绝大部分和用户之间进行的交互都是通过“信号槽”来完成的。有些特殊情况下,信号槽不一定能搞定某个用户的动作行为, Qt 没有提供对应的信号。 此时就需要通过重写事件处理函数的形式,来手动处理事件的响应逻辑。
    3. Qt 中的事件:

      1. 在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。

      2. 当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件是在用户操作时发出,如键盘事件、鼠标事件等,另一些事件则是由系统本身自动发出,如定时器事件。

      3. 常见的 Qt 事件如下:

        Qt14

    4. 事件的处理:

      1. 事件处理一般常用的方法为: 重写相关的 Event 函数。 在 Qt 中,几乎所有的 Event 函数都是虚函数,所以可以重新实现。

      2. 如:在实现鼠标的进入和离开事件时,直接重新实现 enterEvent()和 leaveEvent()即可。

      3. 一个事件有 APP 传递到代码层的逻辑:

        Qt15

  2. 鼠标事件:

    1. 在 Qt 框架中,处理鼠标事件是创建交互式图形用户界面的关键部分。鼠标事件包括鼠标点击、双击、移动、滚轮滚动等。这些事件由 QMouseEvent 类表示,它提供了关于鼠标事件的详细信息,如鼠标位置、按钮状态等。
    2. 在 widget.ui 创建一个 QLabel, 并提升为新类(基类为 QLabel)
  3. 事件分发器:

    1. Qt 拦截消息的五种方法:
      1. 重写框架类 QCoreApplication 的 notify 函数,这个函数将得到整个框架中所有窗口的消息
      2. 给框架类安装一个事件过滤器
      3. 给某窗口安装一个事件过滤器
      4. 继承某窗口并覆写事件分发器 event 函数(该函数负责某个窗口中派发所有子消息)
      5. 继承某窗口并重写窗口的某个子消息(鼠标进入、 退出、 点击、 键盘点击)
    2. 在 Qt 中,事件分发器(EventDispatcher)是一个核心概念,用于处理 GUI 应用程序中的事件。
    3. 事件分发器负责将事件从一个对象传递到另一个对象,直到事件被处理或被取消。
    4. 每个继承自 QObject 类或 QObject 类本⾝都可以在本类中重写 event 函数,来实现相关事件的捕获和拦截。
    5. 在 Qt 中,我们发送的事件都是传给了 QObject 对象,更具体点是传给了 QObject 对象的 event()函数。所有的事件都会进入到这个函数里面,那么我们处理事件就要重写这个event()函数。 event()函数本身不会去处理事件,是而根据事件类型(type 值)调用不同的事件处理函数。
    6. 如果事件在一个类中未被处理, Qt 会继续将事件传递给父对象或下一个事件过滤器(如果有的话)。如果事件最终没有被任何对象处理,它会被传递给默认的事件处理机制。
    7. 当事件已被处理, Qt 会停止事件的进一步传播。
  4. 事件过滤器:

    1. 事件过滤器是在应用程序分发到 event 事件分发器之前,再做一次更高级的拦截。
    2. 每个设备默认没有事件过滤器, 需要安装+重写
  5. 绘图系统与 paintEvent 事件:

    1. Qt 的绘图系统类似于 MCU 单片机的 LCD 裸机开发(区别于 STemWin、 LVGL) —基于一个画点函数(坐标、 颜色)

    2. Qt 的绘图系统允许使用相同的 API 在屏幕和打印设备上进行绘制。整个绘图系统基于QPainter、 QPainterDevice 和 QPaintEngine 三个类。

      1. QPainter(画家) 用来执行绘制的操作
      2. QPaintDevice(画板) 是一个二维空间的抽象,这个二维空间可以由 QPainter 在上面进行绘制
      3. QPaintEngine(画笔) 提供 painter 在不同的设备上进行绘制的统一的接口
    3. Qt 的绘图系统实际上是说,使用 QPainter 使用画笔画刷等工具在QPainterDevice 上面进行绘制,它们之间使用 QPaintEngine 引擎进行通讯。

      Qt16

参考链接: