(一)Qt 那些事儿:关于Qt

(一)Qt 那些事儿:关于Qt

0. concepts

  • qt 是什么?

qt 是一个跨平台的 C++应用程序开发框架,不能简单理解为是一个 gui 开发库。一个开发框架一般会对程序流程强调控制权,并屏蔽这些逻辑的实现,减少开发心智负担。比如说开发 qt 程序的时候,不需要关心事件是如何传递的,信号是如何传递的;屏蔽了这些逻辑,只关注在对事件和信号的响应上。除此,qt 还提供了网络编程、数据库连接等相关功能。因此,应该把 qt 看成是一个 c++应用程序开发框架。 而 Qt 最厉害的就在于元对象系统(Meta-Object System):这是 Qt 的灵魂之一,实现了信号与槽机制、运行时类型信息(RTTI)和动态属性系统。即使不使用 GUI 组件,也能利用这些特性构建松耦合的架构。

  • qt 核心模块

    • 基础层

      • QtCore:提供核心非 GUI 功能,包括:

        • 容器类(QVector, QMap, QList)
        • 事件系统(QEvent, QObject)
        • 线程与并发(QThread, QMutex)
        • 文件与流操作(QFile, QDataStream)
        • 定时器与日期时间(QTimer, QDateTime)
      • QtGui:图形界面基础库(Qt5+ 包含了部分 QtWidgets 的功能):

        • 2D 渲染(QPainter, QImage)
        • 字体与文本(QFont, QTextDocument)
        • 颜色与画笔(QColor, QBrush)
    • GUI 层

      • QtWidgets:传统桌面控件库(基于 QtCore/QtGui):
        • 窗口与对话框(QMainWindow, QDialog)
        • 标准控件(QPushButton, QLabel, QTableView)
        • 布局管理(QVBoxLayout, QGridLayout)
    • 网络与数据层

      • QtNetwork:网络编程模块:

        • HTTP 客户端/服务器(QNetworkAccessManager)
        • TCP/UDP 套接字(QTcpSocket, QUdpSocket)
        • SSL/TLS 支持(QSslSocket)
      • QtSql:数据库访问模块:

        • 支持 SQLite, MySQL, PostgreSQL 等
        • 统一的 API(QSqlDatabase, QSqlQuery)

1. 基础

Qt的基础层主要提供非 GUI 但与操作系统紧密相关的核心功能,以及程序开发所需的基础能力。

在操作系统相关核心功能方面,涵盖文件操作、多线程、时间处理以及事件交互等。在程序开发基础能力方面,则包括容器等内容。

如今看来,除事件交互外,Qt的部分功能似乎与 C++标准库(std)高度重合。然而,考虑到时代背景,std 作为标准库,发展相对缓慢,无法像普通库那样先上线再迭代。在Qt蓬勃发展的时期,std 的容器功能尚不完善,C++11 中的文件操作以及与时间相关操作在多平台的兼容性也欠佳。而Qt作为跨平台的应用程序开发框架,率先提供一套屏蔽不同平台差异的操作系统相关核心基础能力,这与当时它的产品发展定位相符。此外,Qt作为底层库,需要频繁与跨平台环境打交道。自行封装一套跨平台标准接口,对于优化核心功能具有重要意义。因此,在Qt内部涉及跨平台操作或与Qt核心机制交互的场景中,建议使用Qt提供的接口;而在其他一般场景下,可统一采用 std 接口。

Qt基础层中,唯独与事件相关的能力是无法替代且最重要的。操作系统会定期向程序发送各类事件,Qt构建了一套完整的框架来处理这些事件。具体而言,Qt通过事件循环机制,持续监测并消费这些事件。在事件分发过程中,它能够依据事件类型及目标对象的相关信息,将事件精准分发给对应的控件。同时,Qt还提供了事件过滤器、重写事件处理函数等手段,方便开发者对事件处理流程进行控制,以满足不同的业务需求。

2. qt 核心机制

Qt 的核心机制主要包括屏蔽操作系统差异的事件处理机制以及 Meta - Object Compiler(MOC,元对象编译器)机制。

事件处理机制能够屏蔽不同操作系统间的差异,使开发者可以统一地处理各类事件,确保应用程序在不同平台上的行为一致性。

MOC 机制功能强大,涵盖了信号与槽、动态属性以及反射等特性。信号与槽机制是一种强大的对象间通信方式,允许对象之间以松耦合的方式进行事件通知和响应;动态属性使开发者可以在运行时为对象添加属性,增强了程序的灵活性;反射则提供了在运行时获取对象类型信息以及调用对象成员函数等能力。

除上述核心机制外,Qt 在各个模块中还包含一些重要机制:

  • 控件管理

    • 生命周期管理机制:它从控件管理延伸而来,负责管理对象的创建、销毁等生命周期过程,确保资源的合理分配与释放,提高程序的稳定性。
    • 控件布局管理机制:用于合理安排控件在界面中的位置和大小,以适应不同的屏幕尺寸和分辨率,提升用户界面的美观性和易用性。
    • Model - View 分离机制:将数据(Model)和用户界面(View)进行分离,使得数据的处理和显示相互独立,便于代码的维护和扩展,同时也提高了代码的复用性。
  • 桌面应用软件需要

    • 国际化与本地化机制:帮助应用程序适应不同地区和语言的用户需求,通过翻译文件等方式实现界面语言的切换以及日期、数字等格式的本地化显示。
    • 资源管理机制:用于管理应用程序中的各类资源,如图片、图标、文本文件等,确保资源的有效加载和使用,提升资源利用效率。
    • 插件管理机制:允许开发者将应用程序的部分功能以插件形式实现,便于功能的扩展和定制,增强了应用程序的可扩展性和灵活性。

3. gui

GUI 主要由控件、样式、布局这几个关键部分构成。此外,UI 与业务的分离也是需要重点考虑的方面,这通常借助 MVC(Model - View - Controller,模型 - 视图 - 控制器)模式来实现。

  • 控件:作为 GUI 的基本组成单元,它们为用户提供了与应用程序交互的接口。常见的控件包括按钮、文本框、复选框、列表框等。不同类型的控件具有各自独特的功能与属性,比如按钮通常用于触发特定操作,文本框用于输入和显示文本内容。通过合理组合各类控件,能够满足用户多样化的操作需求。
  • 样式:样式决定了 GUI 的外观呈现,涵盖了诸如颜色、字体、边框、背景等多个视觉元素。通过精心设计样式,可以赋予界面独特的风格,提升用户体验。例如,为按钮设置悬停、按下等不同状态下的颜色变化,或者为整个界面选择一套协调的配色方案,使界面在视觉上更加吸引人。
  • 布局:布局负责在界面上合理安排控件的位置与大小,以确保在不同的屏幕尺寸和分辨率下,界面都能保持良好的显示效果。常见的布局方式有水平布局、垂直布局、网格布局以及表单布局等。布局能够有效避免控件之间的重叠或排列混乱,使得界面整洁、有序,易于用户操作。
  • UI 与业务分离 - MVC 模式:在 GUI 开发中,采用 MVC 模式有助于实现 UI 与业务逻辑的清晰分离。其中,“模型(Model)”代表应用程序的数据和业务逻辑,它独立于 UI,负责处理数据的存储、检索和更新等操作。例如,在一个学生信息管理系统中,模型可能包含学生数据的结构体以及对这些数据进行增删改查的函数。“视图(View)”主要负责将模型中的数据以可视化的形式呈现给用户,即 GUI 界面。它会根据模型数据的变化实时更新显示内容。比如,将学生的姓名、成绩等信息在界面上以表格或卡片的形式展示出来。“控制器(Controller)”则充当模型和视图之间的桥梁,接收用户在视图上的操作输入,根据业务逻辑调用模型的相应方法进行处理,并将处理结果反馈给视图进行更新。例如,当用户在界面上点击“删除学生”按钮时,控制器会捕获这个操作,调用模型中的删除函数删除相应的学生数据,然后通知视图更新显示,以反映数据的变化。通过这种方式,MVC 模式使得代码结构更加清晰,易于维护和扩展,不同部分的开发和维护可以相对独立进行,提高了开发效率。

3.1 QtGui

  • QGraphicsScene:管理所有图形项(QGraphicsItem)的“场景”,可以理解为一个容器,存放图形元素和处理元素间的交互
  • QGraphicsView:提供对 QGraphicsScene 的可视化窗口,负责显示和用户交互
  • 这种设计适合复杂图形应用,如绘图工具、游戏等,支持缩放、旋转、层级管理

3.2 QPainter

  • QPainter 是 Qt 中核心的绘图类
  • 负责绘制点、线、矩形、文本、图像等各种图形元素
  • 支持反锯齿、渐变、变换(旋转、缩放)
  • 用于两种模式:

    • Retained GUI(保持模式):控件自动管理绘制,程序只需重写 paintEvent 并用 QPainter 绘制控件内容
    • Immediate GUI(即时模式):每帧都重新绘制整个界面,类似游戏开发中的渲染流程,Qt 主要采用保持模式

3.3 Render

渲染模式 特点 举例
Immediate GUI 每帧重新绘制整个界面,适合对性能要求极高且需要灵活控制的场景 nuklear、raygui
Retained GUI 维护界面元素状态,只在必要时重绘,减少无效绘制,效率高 Qt、MFC、wxWidgets



    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • (七)内核那些事儿:操作系统对网络包的处理
  • (六)内核那些事儿:文件系统
  • (五)内核那些事儿:系统和程序的交互
  • (四)内核那些事儿:设备管理与驱动开发
  • (三)内核那些事儿:CPU中断和信号