执行摘要

Qt Widgets 是一个成熟、全面的、基于 C++ 的用户界面 (UI) 工具包,专为创建高性能、功能丰富的图形应用程序而设计,尤其适用于桌面平台 1。作为 Qt 框架的基石之一,它为开发者提供了一套完整的工具和组件,用于构建从简单对话框到复杂的数据密集型企业级应用的各种界面。

该框架的强大功能和灵活性源于其紧密耦合的架构支柱。所有 UI 元素都派生自核心的 QWidget 基类,该基类统一了事件处理和屏幕绘制的基础能力 1。创新的信号与槽 (Signals and Slots) 机制提供了一种类型安全、松耦合的对象间通信方式,彻底改变了传统的回调模型 5。一个健壮的事件系统负责处理从用户输入到窗口系统通知的所有交互,而一个功能强大的绘图系统则通过QPainter 提供了对像素级渲染的精细控制 8。最后,一个自动化的布局管理器确保了 UI 能够在不同平台和屏幕尺寸上优雅地调整布局,极大地简化了响应式界面的开发 1。

在现代 Qt 生态系统中,Qt Widgets 与其更年轻的同伴 Qt Quick/QML 形成了战略互补关系。Qt Widgets 专注于传统的、以功能和性能为导向的桌面应用,而 Qt Quick 则通过其声明式的 QML 语言,为移动和嵌入式设备提供了创建流畅、动画丰富的现代界面的能力 2。这种分工并非“新旧更替”,而是一种基于应用领域、性能需求和团队专长的关键架构决策。错误地将两者视为竞争对手而非专业工具,可能导致技术选型不当。

尽管行业趋势倾向于声明式 UI,但 Qt Widgets 的地位依然稳固。对于复杂的、性能关键的桌面应用程序,如 CAD 软件、数字内容创作工具和科学可视化平台,它仍然是首选且更优越的解决方案。其稳定性、对底层 C++ 的深度集成以及提供的精细控制能力,确保了它在 Qt 6 框架内及未来的持续 relevance 和支持 13。Qt Widgets 不仅是一个历史悠久的工具包,更是一个经过实战检验、至今仍在关键行业中发挥核心作用的强大框架。

Qt Widgets 的基础架构

Qt Widgets 模块的卓越性能和稳定性源于其设计精良且高度内聚的架构。该架构由五个核心支柱构成:QWidget 基类、信号与槽机制、事件系统、绘图系统和布局管理。这些组件并非孤立存在,而是深度集成,共同构成了一个强大而高效的 C++ GUI 开发平台。

QWidget 的核心角色

在 Qt Widgets 的世界里,QWidget 类是所有用户界面对象的基石,是构成图形界面的“原子单位” 1。每个可见的 UI 元素,无论是按钮、文本框还是整个窗口,都直接或间接地继承自QWidget。

QWidget 的核心地位体现在其独特的双重继承结构上。它同时继承自 QObject 和 QPaintDevice 4。继承自QObject 赋予了 QWidget 参与 Qt 元对象系统的能力,使其能够使用信号与槽机制、获得强大的事件处理能力,并受益于 Qt 的父子对象树内存管理模型 17。继承自QPaintDevice 则意味着每个 QWidget 实例都是一个可以被 QPainter 在其上进行绘制的“画布”,这是实现自定义控件外观的基础 4。

Qt 中的父子关系具有双重含义。首先是内存管理:当一个父 QObject 被销毁时,其所有子对象也会被自动销毁,这极大地简化了 C++ 中的内存管理,有效防止了内存泄漏 17。其次是视觉上的包含关系:一个子控件在屏幕上的显示区域会被其父控件的边界所裁剪 3。一个没有父控件的QWidget 实例会自动成为一个独立的顶级窗口,通常带有操作系统的标准窗口边框和标题栏 1。

Qt 提供了庞大的预置控件库,可以根据功能进行分类 1:

  • 基础控件 (Controls): 用于直接与用户交互的元素,如 QPushButton (按钮)、QLineEdit (单行文本框)、QCheckBox (复选框) 和 QComboBox (下拉列表) 1。
  • 高级控件 (Advanced Widgets): 提供更复杂功能的控件,如 QTableView (表格视图)、QTreeView (树状视图) 和 QCalendarWidget (日历控件) 1。
  • 组织与容器控件 (Organizer Widgets): 用于组织和容纳其他控件,如 QGroupBox (分组框)、QTabWidget (标签页控件) 和 QSplitter (可拖动分隔条) 1。
  • 抽象基类 (Abstract Classes): 如 QAbstractButton 和 QAbstractScrollArea,它们为一组相关控件提供通用的功能接口,但不直接实例化,而是用于派生具体的控件类 1。

信号与槽机制

信号与槽是 Qt 框架最著名和最具创新性的特性,它是一种用于对象间通信的高级机制,旨在替代传统回调函数带来的种种弊端 6。

核心概念与优势

该机制基于三个核心概念:

  • 信号 (Signal): 当一个对象的内部状态发生改变时,它可以发射一个信号。发射信号的对象不关心是否有任何对象接收这个信号,也不需要知道接收者的任何信息,从而实现了真正的信息封装 6。
  • 槽 (Slot): 槽是一个普通的 C++ 成员函数,它被设计用来响应特定的信号。一个槽函数同样不关心是哪个信号触发了它的执行 6。
  • 连接 (Connection): 通过 QObject::connect() 函数,可以将一个对象的信号与另一个(或同一个)对象的槽连接起来 17。

这种松耦合的通信模型带来了显著的优势 6:

  1. 类型安全: 连接时,信号和槽的参数签名必须兼容。基于函数指针的新语法可以在编译时进行检查,而传统的基于字符串的语法也能在运行时检测类型不匹配。
  2. 灵活性: 一个信号可以连接到多个槽,多个信号也可以连接到同一个槽。甚至可以将一个信号直接连接到另一个信号。
  3. 组件化设计: 信号和槽机制使得创建真正独立的、可重用的软件组件成为可能。
元对象编译器 (moc)

信号与槽机制的实现离不开元对象编译器 (Meta-Object Compiler, moc) 5。标准 C++ 语言本身并不支持信号与槽所需的运行时类型信息(内省)。为了解决这个问题,Qt 的创造者引入了一个预处理步骤。

moc 工具会扫描所有包含了 Q_OBJECT 宏的头文件,并为这些类生成额外的 C++ 源代码 17。

这些生成的代码包含了一个元对象 (QMetaObject),它存储了关于类的元信息,如类名、信号、槽以及属性等。正是这些元信息使得 QObject::connect() 能够在运行时查找信号和槽,并建立连接。因此,moc 是 Qt 核心特性得以实现的关键技术,它通过一个非标准的构建步骤,为 C++ 赋予了更高级的动态特性。开发者必须理解,使用 Qt 意味着需要一个支持 moc 的构建系统(如 qmake 或集成了 AUTOUIC 的 CMake),这与纯标准 C++ 项目的构建流程有所不同。

事件系统

如果说信号与槽是对象间高级通信的机制,那么事件系统则是 Qt 应用程序响应底层输入的基石。所有 QObject 的子类都可以接收和处理事件,但它对 QWidget 尤为重要。

事件传递流程

一个事件的生命周期遵循一个明确的、可预测的流程 8:

  1. 事件创建: 当一个事件发生时(例如用户点击鼠标),窗口系统会通知 Qt。Qt 随即创建一个代表该事件的具体 QEvent 子类的实例(例如 QMouseEvent)。
  2. 事件分发: Qt 的事件循环将这个事件对象传递给目标 QObject 的 event() 虚函数。
  3. event() 调度: event() 函数本身通常不直接处理事件,而是扮演一个调度者的角色。它会检查事件的类型 (QEvent::Type),然后调用一个为该类型事件专门设计的、更具体的事件处理器 (event handler)。
  4. ** spécifiques 事件处理器:** 这些处理器是 QWidget 中定义的虚函数,如 mousePressEvent()、keyPressEvent() 或 paintEvent()。开发者通过重写这些函数来实现自定义的事件响应逻辑 3。
  5. 事件接受与忽略: 在事件处理器中,可以调用 accept() 方法来表示事件已被处理,从而阻止它进一步传播。如果调用 ignore(),或者不调用任何方法,事件可能会被传递给其父控件进行处理 27。
事件过滤器

除了直接重写事件处理器,Qt 还提供了一种更为灵活的机制——事件过滤器 (Event Filters)。任何 QObject 都可以通过 installEventFilter() 为另一个对象安装一个事件过滤器。之后,所有发送给目标对象的事件都会先经过过滤器对象的 eventFilter() 函数。这使得一个对象可以在不修改或继承目标对象的情况下,监视甚至拦截其事件,为实现跨组件的复杂交互和行为注入提供了强大的工具 26。

以下表格总结了 QWidget 中一些最关键的事件处理器及其用途:

事件处理器 QEvent 参数 描述
paintEvent() QPaintEvent* 当控件需要重绘时调用。所有自定义绘图代码都应在此函数内执行。
resizeEvent() QResizeEvent* 当控件尺寸改变时调用。
mousePressEvent() QMouseEvent* 当鼠标按键在控件内被按下时调用。
mouseReleaseEvent() QMouseEvent* 当鼠标按键被释放时调用。
mouseMoveEvent() QMouseEvent* 当鼠标在按下按键的状态下移动时调用。
keyPressEvent() QKeyEvent* 当键盘按键被按下时调用。
focusInEvent() QFocusEvent* 当控件获得键盘焦点时调用。
focusOutEvent() QFocusEvent* 当控件失去键盘焦点时调用。
closeEvent() QCloseEvent* 当用户请求关闭窗口时调用。
enterEvent() QEnterEvent* 当鼠标光标进入控件区域时调用。
leaveEvent() QEvent* 当鼠标光标离开控件区域时调用。

资料来源: 3

Qt 绘图系统

Qt 的绘图系统是一个强大且灵活的 2D 图形渲染框架,它允许开发者在各种设备上以统一的 API 进行绘制。该系统的核心由三个紧密协作的类构成 19。

绘图三要素
  1. QPaintDevice: 这是一个抽象基类,代表任何可以被绘制的二维空间。它定义了绘制的“画布”。QWidget、QPixmap(离屏图片)和 QPrinter(打印机)等都是 QPaintDevice 的子类 31。
  2. QPainter: 这是执行绘图操作的类。它提供了一系列函数,用于绘制线条、矩形、椭圆、多边形、文本和图像等。QPainter 只能在 QPaintDevice 上进行操作,它封装了绘图的状态,如画笔 (QPen) 和画刷 (QBrush) 9。
  3. QPaintEngine: 这是一个内部的抽象接口,负责将 QPainter 的高级绘图指令转换为特定后端(如操作系统的原生绘图 API、OpenGL 或打印机驱动)可以理解的底层命令。正是 QPaintEngine 的存在,使得 Qt 的绘图系统能够实现真正的跨平台 19。
paintEvent() 处理器

在 Qt Widgets 中,所有针对 QWidget 的自定义绘图操作都必须在 paintEvent() 事件处理器内部完成,或者在由 paintEvent() 调用的函数中完成 3。当一个控件需要被重绘时(例如,当它首次显示、被遮挡后重新暴露、或者开发者主动调用update() 时),Qt 会向该控件发送一个 QPaintEvent 事件,从而触发 paintEvent() 的执行。

典型的自定义绘图工作流程如下 30:

  1. 创建一个 QWidget 的子类。
  2. 重写 protected 的 paintEvent(QPaintEvent* event) 方法。
  3. 在 paintEvent() 方法内部,创建一个 QPainter 的栈上实例,并将 this 指针(指向当前控件)传递给它的构造函数。
  4. 使用这个 QPainter 对象进行所有绘图操作。
  5. 当 paintEvent() 函数结束时,QPainter 对象会自动析构,完成绘图过程。

这种架构确保了绘图操作总是在正确的时机、在正确的设备上进行,并且由事件循环统一管理,从而保证了界面的稳定和高效。

布局管理

手动设置每个控件的精确位置和大小是一项繁琐且易错的任务,尤其是在需要适应不同屏幕尺寸、分辨率和平台字体的情况下。Qt 的布局管理系统通过自动化的方式解决了这个问题 1。

核心布局类

Qt 提供了几个主要的布局管理器类,用于处理常见的排列需求 10:

  • QHBoxLayout: 将子控件从左到右水平排列。
  • QVBoxLayout: 将子控件从上到下垂直排列。
  • QGridLayout: 在一个二维网格中排列子控件,一个控件可以跨越多行多列。
  • QFormLayout: 专门用于创建表单,以两列的形式排列控件(通常是左边一个 QLabel,右边一个输入控件)。
sizeHint 与 sizePolicy 的协商机制

布局系统并非简单地强制排列控件,而是一个动态的协商过程。每个控件通过两个关键属性向其所在的布局管理器传达自己的尺寸偏好 1:

  • sizeHint: 控件的理想尺寸。
  • sizePolicy: 描述控件在水平和垂直方向上是否愿意被拉伸或压缩,以及其拉伸/压缩的优先级。

布局管理器收集所有子控件的这些信息,结合可用空间的大小,计算出每个控件最终的几何位置和尺寸。当窗口大小改变时,这个计算过程会自动重新进行,从而实现动态、响应式的界面布局。

嵌套布局

通过将一个布局添加到另一个布局中,可以构建出任意复杂的界面结构。例如,可以在一个主 QVBoxLayout 中嵌套几个 QHBoxLayout,以创建既有垂直分层又有水平排列的复杂 UI。这种嵌套能力是 Qt 布局系统强大功能和灵活性的关键所在 10。

这五大架构支柱的紧密集成,是 Qt Widgets 性能和强大功能的根源。QWidget 从 QObject 继承的能力使其能够参与信号与槽和事件系统;从 QPaintDevice 继承的能力使其成为绘图系统的画布。事件系统驱动着绘图事件,而布局管理器则与控件的属性进行交互以实现几何管理。这种内聚的设计,与那些将第三方库拼凑在一起的框架形成鲜明对比,也意味着要精通 Qt Widgets,就必须将其作为一个整体系统来理解,而不仅仅是学习其孤立的各个部分。

历史演进与里程碑

Qt Widgets 的架构和设计理念并非一蹴而就,而是经过三十多年的演进,深受技术发展和商业战略变迁的影响。理解其发展历程,对于把握其在现代 Qt 生态中的定位至关重要。

以下表格概述了 Qt 及其 Widgets 模块演进过程中的关键里程碑:

年份 Qt 版本 关键事件/特性 公司所有权
1990 - Haavard Nord 和 Eirik Chambe-Eng 构思 Qt -
1995 0.90 首次公开发布 (X11/Linux) Troll Tech
1996 1.0 KDE 项目采用 Qt 作为其基础库 Troll Tech
2001 3.0 增加 Mac OS X 支持;引入 Qt Designer Trolltech
2005 4.0 架构全面革新,引入现代化的 API Trolltech
2008 - 诺基亚 (Nokia) 收购 Trolltech Nokia
2009 4.5 推出 Qt Creator IDE;引入 LGPL 授权 Nokia
2010 4.7 推出 Qt Quick,用于移动和触摸界面 Nokia
2012 5.0 Digia 收购全部 Qt 业务;Qt 5.0 发布,代码模块化,引入 Qt Quick 2 Digia
2020 6.0 Qt 6.0 发布,对框架进行现代化改造和 API 清理 The Qt Company

资料来源: 41

起源与早期发展 (Qt 1-3, 1990-2005)

Qt 的故事始于 1990 年挪威特隆赫姆的一个公园长椅上,当时 Haavard Nord 和 Eirik Chambe-Eng 构想了一个面向对象的、跨平台的 GUI 框架 41。1995 年,他们的公司 Troll Tech 发布了第一个公开版本 Qt 0.90 41。

1996 年,新生的 KDE 桌面环境项目决定采用 Qt 作为其底层库,这一决定对双方都产生了深远影响,不仅为 Qt 带来了大量的用户和开发者,也将其牢固地确立为 Linux 生态系统中的重要组成部分 41。为了保证 Qt 对自由软件的永久可用性,KDE 自由 Qt 基金会于 1998 年成立 41。

在 Qt 1 到 Qt 3 的发展阶段,框架稳步扩张,陆续增加了对 Windows 和 Mac OS X 的支持。一个重要的里程碑是 Qt 2.2 引入了第一个版本的 Qt Designer,它确立了通过 .ui XML 文件来定义界面布局,然后由 uic 工具生成 C++ 代码的工作流程,这一模式至今仍是 Qt Widgets 开发的核心部分 44。

Qt 4 时代:成熟与扩张 (2005-2012)

2005 年发布的 Qt 4.0 被视为一次“彻底的改造” 41。尽管它打破了与旧版本的兼容性,但引入了更清晰、更强大、性能更高的架构,这个架构至今仍是 Qt Widgets 的基础。

这一时期见证了两个关键的创新。首先是 2009 年 Qt Creator IDE 的推出 41。它将代码编辑器、调试器、项目管理和 UI 设计工具集成在一起,极大地提升了开发效率,成为 Qt 开发的事实标准。其次,Qt 4.5 引入了 LGPL v2.1 授权协议 41。这一变化允许开发者在不购买商业许可的情况下,将 Qt 用于闭源商业应用程序的开发,从而极大地促进了 Qt 在商业领域的普及和应用。

Qt 5 过渡与 QML 的崛起 (2012-2020)

2008 年,诺基亚收购 Trolltech,意图将 Qt 作为其未来智能手机战略的核心 41。这一商业决策直接催生了一项重大的技术变革。传统的桌面控件模型难以满足新兴的触摸屏设备对流畅动画和动态界面的需求。为此,诺基亚主导开发了一种全新的、声明式的 UI 技术,并于 2010 年以 Qt Quick 的名义发布 41。

然而,随着诺基亚手机战略的转变,Qt 的未来一度变得不确定。2011 至 2012 年,芬兰公司 Digia 分阶段从诺基亚手中收购了 Qt 的全部商业和开源业务,确保了这一重要框架的延续和发展 41。

2012 年发布的 Qt 5.0 是又一次重大的架构革新。它引入了模块化的代码库,使得开发者可以只链接应用所需的模块。更重要的是,它带来了基于 GPU 硬件加速的 Qt Quick 2,并正式确立了 Qt Widgets 和 Qt Quick 并存的双 UI 工具包战略。Qt Widgets 在 Qt 5 中得到了完全的支持和维护,但其渲染机制并未迁移到新的基于场景图的图形架构上,这标志着两种技术在底层实现上的正式分化 41。

Qt 6 的精炼与稳定 (2020-至今)

进入 Qt 6 时代,Qt Widgets 的发展重点转向了现代化、API 清理和长期稳定性,而非引入颠覆性的新功能 13。一些在 Qt 5 中被弃用的类(如QDesktopWidget)被正式移除,许多 API 也进行了更新,以更好地与现代 C++ 标准(如 C++17)保持一致 13。

The Qt Company 对 Widgets 模块的持续投入和精炼,明确表明了其对桌面和企业级应用市场的长期承诺。Qt Widgets 并非一个被遗弃的“遗留”技术,而是一个被视为“功能完备”且持续维护的核心组件 14。这一历史视角揭示了 Qt 当前双轨并行的 UI 策略是商业决策和技术演进共同作用的结果。最初为桌面而生的 Widgets 架构,在移动浪潮的推动下催生了 Quick,最终在新的商业实体下形成了服务于不同市场的专业化分工。

开发者工作流程与工具链

Qt Widgets 的开发生态系统围绕着强大的集成开发环境 Qt Creator 和可视化的 UI 设计工具 Qt Designer 构建。这个生态系统旨在通过将可视化设计与底层 C++ 编程相结合,提供一个高效、灵活且可扩展的开发工作流程。

使用 Qt Creator 进行集成开发

Qt Creator 是 Qt 官方的跨平台集成开发环境 (IDE),它为 Qt 开发提供了从项目创建到部署的全周期支持 45。当开发者启动一个“Qt Widgets Application”项目时,Qt Creator 的向导会自动生成一个标准化的项目结构,包括 18:

  • 一个项目文件 (.pro 用于 qmake 或 CMakeLists.txt 用于 CMake),用于定义项目的构建规则。
  • 一个 main.cpp 文件,包含启动应用程序事件循环的标准入口点。
  • 主窗口的 C++ 头文件 (.h) 和源文件 (.cpp)。
  • 一个 .ui 文件,用于在 Qt Designer 中进行可视化界面设计。

使用 Qt Designer 进行可视化设计

Qt Designer 是一个所见即所得 (WYSIWYG) 的 UI 编辑器,它允许开发者通过拖放的方式来构建界面 1。开发者可以从控件库中选择QPushButton、QTextEdit 等控件,将它们放置在窗体上,并通过属性编辑器直观地配置它们的属性(如文本、对象名、尺寸策略等)50。

Qt Designer 的核心产出是一个基于 XML 格式的 .ui 文件 18。这个文件仅仅描述了 UI 元素的层级结构、几何布局和静态属性,不包含任何业务逻辑代码。这种设计实现了界面表示与业务逻辑的彻底分离。在 Qt Creator 中,双击项目中的.ui 文件会直接在“Design”模式下打开集成的 Qt Designer,提供无缝的开发体验 47。

集成 UI 与逻辑:使用 .ui 文件

将 Designer 创建的可视化界面与 C++ 逻辑代码连接起来,是 Qt Widgets 开发流程的关键一步。这一过程由一个名为 uic (User Interface Compiler) 的构建工具在后台自动完成 18。

uic 在编译时读取 .ui 文件,并生成一个对应的 C++ 头文件(例如,mainwindow.ui 会生成 ui_mainwindow.h)53。这个头文件定义了一个 C++ 结构体(例如Ui_MainWindow),其中包含了指向 .ui 文件中所有控件的指针,以及一个名为 setupUi() 的成员函数。

在 C++ 代码中,有多种方式可以使用这个生成的 UI 类,其中最常用且推荐的是单继承法 (Single Inheritance Approach) 53:

  1. 创建主窗口类: 开发者创建一个继承自标准 Qt 窗口类(如 QMainWindow 或 QWidget)的自定义类。
  2. 包含 UI 成员: 在这个自定义类中,包含一个由 uic 生成的 UI 类的私有成员变量。
  3. 调用 setupUi(): 在自定义类的构造函数中,调用 UI 成员的 setupUi() 方法,并将 this 指针作为参数传入。这个调用会动态地创建 .ui 文件中定义的所有控件,并将它们设置为当前窗口的子控件,同时应用所有布局和属性设置。
// calculatorform.h
#include “ui_calculatorform.h” // 包含 uic 生成的头文件

class CalculatorForm : public QWidget
{
Q_OBJECT
public:
explicit CalculatorForm(QWidget *parent = nullptr);
private:
Ui::CalculatorForm ui; // 将 UI 类作为成员变量
};

// calculatorform.cpp
CalculatorForm::CalculatorForm(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this); // 在构造函数中设置 UI
// 连接信号和槽
connect(ui.inputSpinBox1, &QSpinBox::valueChanged, this, &CalculatorForm::updateResult);
}

资料来源: 53

一旦 setupUi() 完成,开发者就可以通过 ui 成员访问界面上的任何控件(例如 ui->myButton),并将其信号(如 clicked())连接到 C++ 类中定义的槽函数,从而实现界面的交互逻辑 49。这种混合工作流是 Qt Widgets 的核心优势之一:它允许开发者利用可视化工具快速布局,同时保留 C++ 的全部功能来进行复杂的逻辑处理和动态界面控制。

样式与定制化

Qt Widgets 提供了强大的机制来定制应用程序的外观和感觉。

  • QStyle: 这是 Qt 样式系统的核心。QStyle 是一个抽象基类,封装了 GUI 的外观绘制规则。Qt 为每个支持的平台提供了具体的 QStyle 子类(如 Windows、macOS),确保应用程序默认情况下具有原生外观 1。
  • Qt 样式表 (QSS): 对于更深度的定制,开发者可以使用 Qt 样式表。QSS 的语法和概念深受 Web 开发中 CSS 的启发,允许通过文本规则来改变控件的外观 1。QSS 规则可以应用于整个应用程序,也可以应用于特定的控件及其子控件。其语法包括选择器(按类型、对象名或属性选择控件)、子控件(如QComboBox::drop-down)和伪状态(如 :hover、:checked),提供了极大的灵活性 55。

高级 UI 范式

对于超出简单表单和对话框范围的复杂应用程序,掌握 Qt 提供的高级架构模式至关重要。

  • 模型/视图 (Model/View) 架构: 这是 Qt 为处理大量数据集(如数据库查询结果或大型列表)而设计的解决方案。该架构将数据(Model)、数据的可视化表示(View,如 QTableView)和用户与数据的交互方式(Delegate)清晰地分离开来 21。这种分离使得同一份数据可以被多个不同的视图展示,并且极大地提高了代码的可维护性和可测试性。
  • 多线程与 GUI 响应: 任何耗时的操作(如网络请求、文件读写或复杂计算)如果直接在主线程(即 GUI 线程)中执行,都会导致界面冻结,严重影响用户体验。Qt 的多线程编程有一个黄金法则:所有 GUI 相关的对象(QWidget 及其子类)只能在主线程中创建和访问 59。为了实现响应式 UI,推荐使用“工作者对象 (worker object)”模式:创建一个继承自QObject 的工作者类来封装耗时任务,然后创建一个 QThread 实例,并使用 moveToThread() 将工作者对象移动到新线程中。主线程与工作者线程之间的所有通信都必须通过队列连接 (Queued Connections) 的信号和槽来完成,以确保线程安全 60。

掌握这些高级模式是构建健壮、可扩展和高性能 Qt Widgets 应用程序的必经之路。它们并非可选的附加功能,而是应对真实世界复杂需求的标准解决方案。

框架对比分析

在进行技术选型时,将 Qt Widgets 与其在 Qt 生态系统内外的替代方案进行比较至关重要。这有助于架构师根据项目需求、团队技能和长期目标做出明智的决策。

Qt Widgets vs. Qt Quick/QML

这是 Qt 开发者面临的最常见的内部选择。两者并非竞争关系,而是为不同应用场景设计的专业工具。

特性 Qt Widgets Qt Quick/QML
主要语言 C++ QML, JavaScript, C++
UI 范式 命令式 (Imperative) 声明式 (Declarative)
目标平台 桌面 (Windows, macOS, Linux) 移动端、嵌入式、现代桌面
性能特点 轻量级,低输入延迟,CPU 密集型 GPU 加速,擅长复杂图形和动画,可能存在微小输入延迟
动画与样式 功能有限,通过 QSS 或自定义绘制,较繁琐 原生支持,易于实现流畅的动画、过渡和高度定制的视觉效果
学习曲线 对 C++ 开发者友好,概念传统 对熟悉 Web 技术的开发者友好,需要适应声明式和属性绑定思维

资料来源: 2

Qt Widgets 采用命令式编程,开发者通过 C++ 代码逐步构建和操作 UI 元素,提供了对控件行为的精细控制。它非常适合功能驱动、数据密集的传统桌面应用,如企业 ERP、CAD 软件或科学仪器控制面板 2。

相比之下,Qt Quick 使用 QML 这种声明式语言来描述 UI。开发者只需定义 UI 元素及其属性和状态,框架会自动处理渲染和状态转换。这极大地简化了创建动态、富有视觉吸引力的界面,尤其是在移动和嵌入式设备上,触摸交互和流畅动画是核心需求 63。

在性能方面,Widgets 通常更轻量,对于简单的用户交互,其“点击到响应”的延迟可能更低。而 Quick 利用 GPU 进行场景图渲染,处理复杂的、包含大量动画和高分辨率图形的场景时性能远超 Widgets。然而,其线程化的渲染循环可能会引入 1-2 帧的固有延迟 62。

Qt Widgets vs. GTK

GTK (GIMP Toolkit) 是 Qt 在 Linux 桌面环境下的主要竞争对手,尤其是在 GNOME 生态中。

特性 Qt Widgets GTK
核心理念 全功能 C++ 框架 C 语言 GUI 工具包
主要语言 C++ (官方), Python 等 C (官方), C++, Python, Rust 等 (通过 GObject Introspection)
外观与感觉 通过样式引擎模拟原生外观,跨平台一致性高 使用主题,默认 Adwaita 主题与 GNOME 深度绑定
开发工具 官方集成 IDE (Qt Creator) 和 UI 设计器 依赖第三方 IDE,官方 UI 设计器 Glade 发展不一
授权模式 LGPL / GPL / 商业版 LGPL
生态系统广度 包含网络、数据库、多媒体等模块的综合框架 专注于 GUI,依赖其他库实现非 GUI 功能

资料来源: 65

最显著的区别在于底层架构和语言。Qt 是一个庞大的 C++ 框架,旨在提供从 UI 到网络、数据库的全方位解决方案 67。而 GTK 是一个用 C 语言编写的、更专注于 GUI 的工具包,通过 GObject 系统实现了面向对象的特性,并借助 GObject Introspection 提供了对多种编程语言的良好绑定支持 65。

在外观上,Qt Widgets 通过其样式引擎在各个平台上模拟原生控件,并提供了像“Fusion”这样的通用样式,以确保高度的跨平台视觉一致性 69。GTK 则严重依赖主题,其默认的 Adwaita 主题与 GNOME 的设计语言紧密相连,这使得 GTK 应用在非 GNOME 环境(如 Windows 或 KDE Plasma)下可能显得格格不入 65。

在工具链方面,Qt Creator 为 Qt 提供了无与伦比的“开箱即用”体验。而 GTK 开发者通常需要在各种通用 IDE 中自行配置开发环境,其官方 UI 设计器 Glade 的支持和集成度也不及 Qt Designer 65。

Qt Widgets vs. wxWidgets

wxWidgets 是另一个流行的 C++ 跨平台 GUI 库,它与 Qt 在实现 GUI 的核心哲学上存在根本差异。

特性 Qt Widgets wxWidgets
核心理念 模拟 (Emulation): 自行绘制所有控件 包装 (Wrapping): 尽可能使用平台原生控件
主要语言 C++ (带元对象扩展) 标准 C++
外观与感觉 高度一致的跨平台外观,接近原生 真正的原生外观,但可能因平台而异
开发工具 官方集成 IDE (Qt Creator) 和 UI 设计器 依赖第三方工具或手动编码
授权模式 LGPL / GPL / 商业版 宽松的 LGPL (允许静态链接闭源应用)
功能集 丰富且统一的控件集 功能集受限于各平台原生控件的“最小公分母”

资料来源: 70

Qt 的核心方法是自己绘制每一个控件,通过复杂的样式引擎来模仿不同操作系统的原生观感 5。这种方法的优点是能够保证在所有平台上实现像素级的视觉一致性,并能提供超越任何单一平台原生控件集的丰富功能。缺点是,模拟可能无法完美复刻所有原生平台的细微行为和特性。

wxWidgets 则采取了相反的策略:它尽可能地使用目标平台提供的原生控件 71。这保证了应用程序拥有 100% 的原生外观和行为。然而,这种方法的代价是,wxWidgets 的功能集往往受限于所有目标平台都支持的“最小公分母”,并且不同平台间的细微行为差异可能导致更多的平台特定代码 70。

因此,“原生外观”并非一个简单的二元选择,而是一个光谱。wxWidgets 提供了“真正的”原生,但可能伴随着功能限制和平台差异。Qt 提供了“高保真的”原生模拟,换来的是完美的跨平台一致性和更强大的功能集。对于需要复杂自定义控件和统一用户体验的专业应用程序而言,Qt 的方法通常更具优势。

在授权方面,wxWidgets 的许可证包含一个特殊的例外,允许商业闭源应用程序静态链接其库,这对于希望发布单个可执行文件且避免分发动态链接库的开发者来说,是一个显著的优势 73。

Qt Widgets 在现代应用开发中的未来

在以移动优先、Web 技术和声明式 UI 为主导的现代软件开发浪潮中,评估像 Qt Widgets 这样一个成熟的、基于 C++ 的桌面 UI 框架的未来地位显得尤为重要。分析表明,Qt Widgets 的未来并非被淘汰,而是在其核心领域内继续保持优势,并与新技术(尤其是 Qt Quick)融合共存。

持久的优势与核心应用场景

Qt Widgets 的生命力源于其在特定领域的不可替代性。对于功能复杂、数据密集、性能关键的桌面应用程序,它仍然是行业标准和首选技术 2。这些领域包括:

  • 专业内容创作工具 (DCC): 如 Autodesk Maya、Krita 等,需要精细的控件布局和对底层图形操作的直接控制 5。
  • 计算机辅助设计 (CAD) 和工程软件: 如 FreeCAD、QCAD,这类应用依赖于复杂的 2D/3D 视图、精确的数值输入和大量的工具面板 5。
  • 科学与医疗可视化: 如 ParaView,需要处理海量数据并在复杂的视图中进行高性能渲染 5。
  • 金融交易和数据分析平台: 如 RStudio,界面由大量的表格、图表和数据输入字段组成,对响应速度和数据准确性要求极高 5。

在这些场景中,Qt Widgets 的直接 C++ 实现、对渲染和事件处理的细粒度控制、以及经过数十年打磨的稳定控件集,提供了声明式 UI 框架难以企及的性能和控制力 2。它被视为“功能完备” (done) 的技术,意味着其稳定性和可靠性已经过实战的长期检验 14。

在 QML 主导世界中的挑战

尽管优势明显,Qt Widgets 在当前环境下也面临挑战。

  • 美学与动画的差距: 创建具有现代美学、流畅动画和触摸友好体验的 UI,在 Qt Widgets 中远比在 Qt Quick 中困难和耗时 12。
  • 开发者关注度: The Qt Company 的新功能开发和市场宣传重点明显倾向于 Qt Quick/QML 15。这可能会影响新学习资源的数量,并塑造新一代开发者对技术栈的认知。

前进之路:稳定、共存与混合化

综合来看,Qt Widgets 的未来发展路径并非衰落,而是走向稳定、共存和与新技术融合。

  • 稳定而非弃用: 官方和社区的共识都非常明确:Qt Widgets 不会被弃用。它是 Qt 6 的核心支持模块,并且由于其庞大的现有用户基础和在特定领域的适用性,将在可预见的未来继续得到维护和支持 13。
  • 混合应用 (Hybrid Applications): 这是 Qt UI 技术的关键发展方向。开发者可以利用 QQuickWidget 类将 Qt Quick 编写的 UI 组件无缝嵌入到 Qt Widgets 应用程序中,反之亦然,也可以在 Qt Quick 应用中弹出 Qt Widgets 对话框或窗口 82。这种混合模式允许开发者博采众长:
    • 使用 Qt Widgets 构建应用程序的主框架、菜单栏、工具栏和复杂的数据视图(如表格和树)。
    • 使用 Qt Quick 创建嵌入式的、具有现代外观和丰富动画的“内容岛”,例如仪表盘、信息图表或自定义的触摸控件。

在 2025 年的 Qt 全球峰会上,关于“结合 Qt Widgets 和 QML 的混合 UI”的讨论被明确提及,这表明 The Qt Company 不仅在维护两个独立的技术栈,更在积极投资于使它们能够协同工作的技术 82。

战略建议

基于以上分析,对技术选型提出以下建议:

  • 选择 Qt Widgets: 当目标是开发性能关键的桌面软件,特别是涉及高密度数据显示(复杂的表格、树)、需要精细像素级控制或团队拥有深厚 C++ 背景时。
  • 选择 Qt Quick: 当目标是移动应用、嵌入式设备,或者 UI 设计要求高度动画化、视觉风格化,以及需要快速原型验证时。
  • 考虑混合方案: 当需要逐步现代化一个庞大的旧有 Qt Widgets 应用,或在新的桌面应用中既需要传统框架的稳健性,又希望引入现代化的、动态的 UI 元素时。

最终,Qt Widgets 的未来在于其作为专业工具的持续价值。它与 Qt Quick 的关系将越来越趋向于共生,而非替代。对于软件架构师而言,这意味着技术选型不再是简单的“二选一”,而是需要根据应用的不同部分,策略性地选择和组合最合适的工具,以构建出兼具性能、功能和现代用户体验的优秀应用程序。

引用的著作
  1. Qt 4.8: Widgets and Layouts, 访问时间为 九月 14, 2025, https://tool.oschina.net/uploads/apidocs/qt/widgets-and-layouts.html
  2. Qt Widgets vs. Qt Quick: A Comprehensive Comparison - Brainz Magazine, 访问时间为 九月 14, 2025, https://www.brainzmagazine.com/post/qt-widgets-vs-qt-quick-a-comprehensive-comparison
  3. Qt 4.1: QWidget Class Reference, 访问时间为 九月 14, 2025, https://neo.dmcs.p.lodz.pl/po/qt-tutorial/docs/qt/qwidget.html
  4. QWidget Class | Qt Widgets | Qt 6.9.2 - Qt Documentation, 访问时间为 九月 14, 2025, https://doc.qt.io/qt-6/qwidget.html
  5. Qt (software) - Wikipedia, 访问时间为 九月 14, 2025, https://en.wikipedia.org/wiki/Qt_(software)
  6. Signals & Slots | Qt Core 5.7, 访问时间为 九月 14, 2025, https://stuff.mit.edu/afs/athena/software/texmaker_v5.0.2/qt57/doc/qtcore/signalsandslots.html
  7. Signals & Slots | Qt Core | Qt 6.9.2 - Qt Documentation, 访问时间为 九月 14, 2025, https://doc.qt.io/qt-6/signalsandslots.html
  8. The Event System | Qt Core | Qt 6.9.2 - Qt Documentation, 访问时间为 九月 14, 2025, https://doc.qt.io/qt-6/eventsandfilters.html
  9. QPainter — PySide v1.0.7 documentation, 访问时间为 九月 14, 2025, https://srinikom.github.io/pyside-docs/PySide/QtGui/QPainter.html
  10. Qt 4.7: Layout Management, 访问时间为 九月 14, 2025, https://ftp.nmr.mgh.harvard.edu/pub/dist/freesurfer/tutorial_versions/freesurfer/lib/qt/qt_doc/html/layout.html
  11. Qt Quick vs. Qt Widget [closed] - Stack Overflow, 访问时间为 九月 14, 2025, https://stackoverflow.com/questions/8626355/qt-quick-vs-qt-widget
  12. QML vs Qt Widgets – detailed comparison - Somco Software, 访问时间为 九月 14, 2025, https://somcosoftware.com/en/blog/qml-vs-qt-widgets-detailed-comparison
  13. Changes to Qt Widgets | Qt Widgets | Qt 6.9.2 - Qt Documentation, 访问时间为 九月 14, 2025, https://doc.qt.io/qt-6/widgets-changes-qt6.html
  14. Are widgets deprecated or not? : r/QtFramework - Reddit, 访问时间为 九月 14, 2025, https://www.reddit.com/r/QtFramework/comments/15jlff5/are_widgets_deprecated_or_not/
  15. The Future of Qt as a C++ API - Qt Forum, 访问时间为 九月 14, 2025, https://forum.qt.io/topic/162010/the-future-of-qt-as-a-c-api
  16. QWidget Class - MIT, 访问时间为 九月 14, 2025, https://web.mit.edu/~firebird/arch/sun4x_59/doc/html/qwidget.html
  17. djeada/Qt-Widgets: A collection of examples and reusable elements created with Qt6 widgets. - GitHub, 访问时间为 九月 14, 2025, https://github.com/djeada/Qt-Widgets
  18. Getting Started Programming with Qt Widgets - Felgo, 访问时间为 九月 14, 2025, https://felgo.com/doc/qt5/qtwidgets-tutorials-notepad-example/
  19. Paint System | Qt GUI | Qt Documentation (Pro) - Felgo, 访问时间为 九月 14, 2025, https://felgo.com/doc/qt/paintsystem/
  20. Widgets Tutorial | Qt Widgets | Qt 6.9.2 - Qt Documentation, 访问时间为 九月 14, 2025, https://doc.qt.io/qt-6/widgets-tutorial.html
  21. Qt Widgets - Developpez.com, 访问时间为 九月 14, 2025, https://qt.developpez.com/doc/6.7/qtwidgets-index/
  22. Widgets Classes | Qt Widgets | Qt 6.9.2 - Qt Documentation, 访问时间为 九月 14, 2025, https://doc.qt.io/qt-6/widget-classes.html
  23. What is meant by slots and signals in Qt classes? [duplicate] - Stack Overflow, 访问时间为 九月 14, 2025, https://stackoverflow.com/questions/26790677/what-is-meant-by-slots-and-signals-in-qt-classes
  24. Signals and Slots - Qt for Python, 访问时间为 九月 14, 2025, https://doc.qt.io/qtforpython-6/tutorials/basictutorial/signals_and_slots.html
  25. How does Qt implement signals and slots? - Stack Overflow, 访问时间为 九月 14, 2025, https://stackoverflow.com/questions/2008033/how-does-qt-implement-signals-and-slots
  26. PyQt - Event Handling - Tutorialspoint, 访问时间为 九月 14, 2025, https://www.tutorialspoint.com/pyqt/pyqt_event_handling.htm
  27. QEvent Class | Qt Core 5.15.1, 访问时间为 九月 14, 2025, https://qthub.com/static/doc/qt5/qtcore/qevent.html
  28. track events in Qt - c++ - Stack Overflow, 访问时间为 九月 14, 2025, https://stackoverflow.com/questions/14269128/track-events-in-qt
  29. Event handlers in Qt - c++ - Stack Overflow, 访问时间为 九月 14, 2025, https://stackoverflow.com/questions/10627242/event-handlers-in-qt
  30. CS311 | Painting with QPainter - Anass Belcaid, 访问时间为 九月 14, 2025, https://anassbelcaid.github.io/CS311/lectures/painting/
  31. The Paint System - Qt 4.1, 访问时间为 九月 14, 2025, http://lux.dmcs.p.lodz.pl/mjp2/qt-tutorial/docs/qt/paintsystem.html
  32. QPaintDevice Class | Qt GUI| Felgo Documentation, 访问时间为 九月 14, 2025, https://felgo.com/doc/qt5/qpaintdevice/
  33. QPaintDevice Class - Qt, 访问时间为 九月 14, 2025, https://qt.developpez.com/doc/5.12/qpaintdevice/
  34. QPainter | Documentation | Qt Developer Network, 访问时间为 九月 14, 2025, https://qt.developpez.com/doc/4.8/qpainter/
  35. QPainter Class | Qt GUI 5.7, 访问时间为 九月 14, 2025, https://stuff.mit.edu/afs/athena/software/texmaker_v5.0.2/qt57/doc/qtgui/qpainter.html
  36. QPaintEngine Class | Qt GUI | Qt 6.9.2, 访问时间为 九月 14, 2025, https://doc.qt.io/qt-6/qpaintengine.html
  37. Qt 4.7: QPaintEngine Class Reference, 访问时间为 九月 14, 2025, https://qt.developpez.com/doc/4.7/qpaintengine/
  38. How to use QPainter - Qt Wiki, 访问时间为 九月 14, 2025, https://wiki.qt.io/How_to_use_QPainter
  39. How do you connect paintEvent to a slot? - c++ - Stack Overflow, 访问时间为 九月 14, 2025, https://stackoverflow.com/questions/21652063/how-do-you-connect-paintevent-to-a-slot
  40. PyQt Layouts: Create Professional-Looking GUI Applications - Real Python, 访问时间为 九月 14, 2025, https://realpython.com/python-pyqt-layout/
  41. Qt History - Qt Wiki, 访问时间为 九月 14, 2025, https://wiki.qt.io/Qt_History
  42. From QtWidgets to Qt6 and Beyond: What Is Qt Capable Of? - Extenly, 访问时间为 九月 14, 2025, https://extenly.com/2024/12/20/from-qtwidgets-to-qt6-and-beyond-what-is-qt-capable-of/
  43. Qt version history - Qt Wiki, 访问时间为 九月 14, 2025, https://wiki.qt.io/Qt_version_history
  44. The Evolution of Qt Designer | CrossPlatform.RU, 访问时间为 九月 14, 2025, http://crossplatform.ru/?q=node/279
  45. Qt Creator - Wikipedia, 访问时间为 九月 14, 2025, https://en.wikipedia.org/wiki/Qt_Creator
  46. Introduction to Qt | Object Computing, Inc., 访问时间为 九月 14, 2025, https://objectcomputing.com/resources/publications/sett/june-2017-introduction-to-qt
  47. Thread: Qt Designer/Qt Creator do I understand the difference? - Qt Centre Forum, 访问时间为 九月 14, 2025, https://www.qtcentre.org/threads/66869-Qt-Designer-Qt-Creator-do-I-understand-the-difference
  48. Getting Started Programming with Qt Widgets | Qt 5.7 - MIT, 访问时间为 九月 14, 2025, https://stuff.mit.edu/afs/athena/software/texmaker_v5.0.2/qt57/doc/qtdoc/gettingstartedqt.html
  49. Tutorial: Qt Widgets application | Qt Creator Documentation, 访问时间为 九月 14, 2025, https://doc.qt.io/qtcreator/creator-writing-program.html
  50. Qt Designer and Python: Build Your GUI Applications Faster, 访问时间为 九月 14, 2025, https://realpython.com/qt-designer-python/
  51. Qt Designer vs Handcoding - Stack Overflow, 访问时间为 九月 14, 2025, https://stackoverflow.com/questions/4114389/qt-designer-vs-handcoding
  52. User Interface Compiler (uic) - MIT, 访问时间为 九月 14, 2025, https://web.mit.edu/~firebird/arch/i386_rhel3/doc/html/uic.html
  53. Using a Designer UI File in Your C++ Application | Qt Widgets …, 访问时间为 九月 14, 2025, https://doc.qt.io/qt-6/designer-using-a-ui-file.html
  54. Qt Style Sheets | Qt Widgets 5.15.1, 访问时间为 九月 14, 2025, https://qthub.com/static/doc/qt5/qtwidgets/stylesheet.html
  55. The Style Sheet Syntax | Qt Widgets | Qt 6.9.2 - Qt Documentation, 访问时间为 九月 14, 2025, https://doc.qt.io/qt-6/stylesheet-syntax.html
  56. The Style Sheet Syntax | Qt Widgets 5.7 - MIT, 访问时间为 九月 14, 2025, https://stuff.mit.edu/afs/athena/software/texmaker_v5.0.2/qt57/doc/qtwidgets/stylesheet-syntax.html
  57. Model/View Tutorial | Qt Widgets | Qt 6.9.2 - Qt Documentation, 访问时间为 九月 14, 2025, https://doc.qt.io/qt-6/modelview.html
  58. An Introduction to Model/View Programming - Qt 4.4, 访问时间为 九月 14, 2025, https://radekp.github.io/qtmoko/api/model-view-introduction.html
  59. Multithreading with Qt | KDAB, 访问时间为 九月 14, 2025, https://www.kdab.com/documents/multithreading-with-qt.pdf
  60. Multithreading Technologies in Qt | Qt 6.9 - Qt Documentation, 访问时间为 九月 14, 2025, https://doc.qt.io/qt-6/threads-technologies.html
  61. Qt multithreading and let the second thread update the main (UI) thread - Qt Centre Forum, 访问时间为 九月 14, 2025, https://www.qtcentre.org/threads/62268-Qt-multithreading-and-let-the-second-thread-update-the-main-(UI)-thread
  62. Performance difference between Qt Quick and Qt Widgets : r/QtFramework - Reddit, 访问时间为 九月 14, 2025, https://www.reddit.com/r/QtFramework/comments/17asox3/performance_difference_between_qt_quick_and_qt/
  63. Qt Widgets vs. Qt Quick: Deciding the Best Approach for Your Project - Extenly, 访问时间为 九月 14, 2025, https://extenly.com/2024/05/06/qt-widgets-vs-qt-quick-deciding-the-best-approach-for-your-project/
  64. Qt, QML, Widgets…What Is The Difference? - Qt for Python, 访问时间为 九月 14, 2025, https://doc.qt.io/qtforpython-6/faq/whatisqt.html
  65. Differences Between GTK+ and Qt Applications | Baeldung on Linux, 访问时间为 九月 14, 2025, https://www.baeldung.com/linux/gui-toolkits-gtk-qt
  66. Experience with QT and GTK : r/linux - Reddit, 访问时间为 九月 14, 2025, https://www.reddit.com/r/linux/comments/1dowotp/experience_with_qt_and_gtk/
  67. python - What’s the difference between GTK and QT? - Ask Ubuntu, 访问时间为 九月 14, 2025, https://askubuntu.com/questions/85144/whats-the-difference-between-gtk-and-qt
  68. Qt Vs GTK+ Vs WxWidgets - A Comparative Study | System on Module, 访问时间为 九月 14, 2025, https://www.e-consystems.com/blog/system-on-module-som/qt-vs-gtk-vs-wxwidgets-a-comparative-study/
  69. Qt vs wxWidgets vs GTK recommendation : r/cpp - Reddit, 访问时间为 九月 14, 2025, https://www.reddit.com/r/cpp/comments/1cp1341/qt_vs_wxwidgets_vs_gtk_recommendation/
  70. The main cross platform open source offerings are GTK and QT. There are lightwei… | Hacker News, 访问时间为 九月 14, 2025, https://news.ycombinator.com/item?id=25446474
  71. SoftwareLogic Tech Blog | wxWidgets vs. Qt: Which Cross-Platform …, 访问时间为 九月 14, 2025, https://softwarelogic.co/en/blog/wxwidgets-vs-qt-choosing-the-right-cross-platform-gui-library
  72. What is the difference between Qt and WX GUIs? - Quora, 访问时间为 九月 14, 2025, https://www.quora.com/What-is-the-difference-between-Qt-and-WX-GUIs
  73. QT vs wxWidgets [closed] - c++ - Stack Overflow, 访问时间为 九月 14, 2025, https://stackoverflow.com/questions/19352797/qt-vs-wxwidgets
  74. wxWidgets libraries versus QT libraries - Google Groups, 访问时间为 九月 14, 2025, https://groups.google.com/g/wx-users/c/I9pOQ36HHBM
  75. High performance pixel perfect applications. Qt vs wxWidgets vs GTK+ : r/cpp - Reddit, 访问时间为 九月 14, 2025, https://www.reddit.com/r/cpp/comments/ucgrxh/high_performance_pixel_perfect_applications_qt_vs/
  76. Genuine, non-trolling question: why wxWidgets instead of, say QT or GTK? ((Looki… | Hacker News, 访问时间为 九月 14, 2025, https://news.ycombinator.com/item?id=26816670
  77. Using Qt: 10 Famous and Successful Cases | by Anastasia Ponomareva | Integra Sources, 访问时间为 九月 14, 2025, https://medium.com/integra-sources-blog/using-qt-10-famous-and-successful-cases-b41f3466a8c5
  78. List of Qt Applications - Qt Wiki, 访问时间为 九月 14, 2025, https://wiki.qt.io/List_of_Qt_Applications
  79. Is Qt 6 worth it in 2025? : r/learnprogramming - Reddit, 访问时间为 九月 14, 2025, https://www.reddit.com/r/learnprogramming/comments/1lc3py1/is_qt_6_worth_it_in_2025/
  80. Is migration from widgets to qml is worth additional time for development? : r/QtFramework, 访问时间为 九月 14, 2025, https://www.reddit.com/r/QtFramework/comments/17sywcg/is_migration_from_widgets_to_qml_is_worth/
  81. Why Qt for Cross-Platform UI Development? - Developex, 访问时间为 九月 14, 2025, https://developex.com/blog/why-qt-for-ui-development/
  82. June 2025 Newsletter: Qt Widgets in QML, Software Architecture Documentation, Qt World Summit Interviews, Events, Trainings & The Curious Developer | KDAB, 访问时间为 九月 14, 2025, https://www.kdab.com/newsletter/june-2025-newsletter-qt-widgets-in-qml-software-architecture-documentation-qt-world-summit-interviews-events-trainings-the-curious-developer/
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐