【QT随笔】一文完美概括QT中的QCoreApplication、QGuiApplication与QApplication(三大 Application 基类)
QCoreApplication 、QGuiApplication 和 QApplication 是应用程序初始化和事件循环的三大 Application 核心类,它们的区别直接决定了应用的类型。本文在介绍过程中力求做到图、表、文并茂,以便轻松理解
、
QCoreApplication
与
QGuiApplication
!
QApplication
(关注不迷路哈!!!)
文章目录
【QT随笔】一文完美概括QT中的QCoreApplication、QGuiApplication与QApplication(三大 Application 基类)前言一、QCoreApplication📌 核心定位🔑 核心功能
二、QGuiApplication📌 核心定位🔑 核心功能详解
三、QApplication📌 核心定位🔑 核心功能
四、三大 Application 基类对比汇总1. QCoreApplication2. QGuiApplication3. QApplication4. 对比表(快速查阅)
五、三大 Application 基类示例代码1. QCoreApplication (非 GUI)2. QGuiApplication (QML/Quick 应用)3. QApplication (Widgets 应用)
总结
前言
QCoreApplication: 用于非 GUI 的 Qt 程序(后台、控制台、服务);QGuiApplication: 在 QCoreApplication 基础上,增加了 图形系统支持,但不含 Widgets;QApplication: 继承自 QGuiApplication,专为图形界面(GUI) 程序准备,支持多种 GUI 资源。
应用总结:
👉 无界面 → QCoreApplication
👉 界面但不用 Widgets(QML/Quick) → QGuiApplication
👉 界面 + Widgets 控件 → QApplication
一、QCoreApplication
继承自 QObject,非GUI应用程序的基类
📌 核心定位
Qt 应用的基础类(所有应用必有的基类)。提供 事件循环(event loop) 和 信号槽机制。不依赖 GUI,适合 命令行、服务、后台进程。
🔑 核心功能
事件循环管理
启动主事件循环。
exec()
/
quit()
控制应用退出。 事件投递与分发
exit()
支持
和
postEvent()
。保证异步事件调度。 定时器支持
sendEvent()
依赖其事件循环。 命令行参数处理
QTimer
在构造函数中解析
,支持 Qt 内置参数。 全局对象生命周期管理
argc/argv
提供
信号。负责清理 Qt 内部资源。
aboutToQuit
二、QGuiApplication
继承自 QCoreApplication,被继承于 QApplication
📌 核心定位
继承自 QCoreApplication,扩展 图形相关的功能。QApplication 的父类。适合 QML/Qt Quick/OpenGL 应用 ——即需要 GUI,但不依赖传统 QWidget。
🔑 核心功能详解
窗口系统集成
提供 顶层窗口管理(通过
)。支持多窗口、多屏幕(如笔记本 + 外接显示器)。管理窗口事件(最小化、最大化、移动、关闭)。 输入事件处理
QWindow
键盘输入(
)。鼠标事件(点击、移动、滚轮)。触摸/手势事件(
QKeyEvent
、
QTouchEvent
)。 屏幕与显示管理
QGestureEvent
通过
管理显示设备信息:
QScreen
分辨率 / DPI / 缩放比例。屏幕方向(横屏 / 竖屏)。多显示器支持。 图形系统资源
提供系统级字体(
)。光标样式管理(
QFont
)。剪贴板支持(
QCursor
)。输入法支持(虚拟键盘、多语言输入)。 高 DPI 与多平台适配
QClipboard
自动处理不同平台(Windows/macOS/Linux/Android/iOS)上的 DPI 缩放。提供跨平台一致的 UI 行为。
三、QApplication
GUI应用程序的基类继承自 QCoreApplication
📌 核心定位
继承自 QGuiApplication,进一步扩展。专为 桌面 GUI 应用(Widgets) 设计。提供 窗口、控件、图形渲染、输入处理。
🔑 核心功能
继承 QGuiApplication 的功能
窗口系统集成输入事件处理(键盘、鼠标、触摸)屏幕管理(多显示器、DPI)字体、光标、剪贴板等系统资源 Widgets 管理
创建和管理 QWidget 控件(按钮、菜单、文本框等)。提供窗口层级管理。 GUI 样式与主题支持
通过
管理平台外观。支持命令行参数
QStyle
。 主窗口与应用关闭机制
-style
当最后一个窗口关闭时,自动退出事件循环(可配置)。 拖放与剪贴板扩展
与操作系统交互更紧密,支持丰富的数据传递。
四、三大 Application 基类对比汇总
1. QCoreApplication
最轻量:仅事件循环/信号槽。适合控制台程序、后台服务。模块依赖:
。
QT += core
2. QGuiApplication
增加图形系统支持:窗口、输入、屏幕、字体、剪贴板等。常用于 QML/Qt Quick/OpenGL 应用。模块依赖:
。
QT += core gui
3. QApplication
继承 QGuiApplication,额外支持 Widgets(按钮、菜单、对话框)。适合传统桌面应用。模块依赖:
。
QT += core gui widgets
4. 对比表(快速查阅)
特性/类别 | QCoreApplication | QGuiApplication | QApplication |
---|---|---|---|
应用类型 | 非 GUI(控制台 / 服务 / 后台进程) | GUI 应用(QML/Qt Quick / OpenGL) | GUI 应用(基于 Widgets 的桌面应用) |
继承体系 | 继承自
|
继承自
|
继承自
|
依赖模块 | QtCore | QtCore + QtGui | QtCore + QtGui + QtWidgets |
事件循环 | ✅ 支持 | ✅ 支持 | ✅ 支持 |
定时器 / 信号槽 | ✅ 支持 | ✅ 支持 | ✅ 支持 |
窗口系统 | ❌ 无 | ✅ 支持(窗口、图形系统 QWindow) | ✅ 支持(控件事件 QWidget + 图形事件 QWindow) |
输入事件 | ❌ 无 | ✅ 支持(键盘 / 鼠标 / 触摸 / 手势) | ✅ 支持 |
屏幕管理 | ❌ 无 | ✅ 支持(多显示器 / DPI / 屏幕方向) | ✅ 支持 |
字体 / 光标 / 剪贴板 | ❌ 无 | ✅ 支持 | ✅ 支持 |
Widgets 支持 | ❌ 无 | ❌ | ✅ 支持 |
资源占用 | 轻量 | 中等 | 较高(加载 Widgets 模块) |
退出机制 | 需手动 quit | 需手动 quit | 默认最后窗口关闭时退出 |
典型应用场景 | 后台任务、守护进程、命令行工具 | QML / Qt Quick / OpenGL 应用 | 桌面软件(办公、开发工具、图形界面程序) |
五、三大 Application 基类示例代码
1. QCoreApplication (非 GUI)
#include <QCoreApplication> #include <QTimer> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QTimer::singleShot(1000, &app, [](){ qDebug() << "定时器触发,退出程序"; app.quit(); }); return app.exec(); }
cpp 运行12345678910111213
2. QGuiApplication (QML/Quick 应用)
#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); }
cpp 运行123456789101112
3. QApplication (Widgets 应用)
#include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton button("点击退出"); QObject::connect(&button, &QPushButton::clicked, &app, &QCoreApplication::quit); button.show(); return app.exec(); }
cpp 运行1234567891011
总结
QCoreApplication → 基础逻辑和事件循环QGuiApplication → 加入 图形系统支持(窗口 + 输入 + 屏幕 + 字体 + DPI)QApplication → 在 QGuiApplication 基础上再加 Widgets,面向传统桌面 GUI 应用
👉 如果你开发 QML/Qt Quick 应用,必须用
QGuiApplication
👉 如果你要写传统桌面 GUI(带按钮、菜单),就用
QApplication
👉 记忆口诀: Core → Gui → Widgets(逐级增强功能,按需选择即可)