强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Qt 与 GTK 图形框架教程 / 01 - Qt 与 GTK 概述 / Introduction

Qt 与 GTK 概述 / Introduction to Qt & GTK

理解两大主流 GUI 框架的前世今生,为技术选型打下基础。 Understanding the history and philosophy of the two major GUI frameworks.


1.1 历史回顾 / Historical Overview

Qt 发展历程

年份 / Year 里程碑 / Milestone
1991 Haavard Nord 和 Eirik Chambe-Eng 创建 Qt / Qt created by Trolltech
1996 Qt 1.0 发布,KDE 项目启动 / Qt 1.0 released, KDE project started
2008 Nokia 收购 Trolltech / Nokia acquires Trolltech
2012 Digia 从 Nokia 收购 Qt / Digia acquires Qt from Nokia
2014 Qt 5.0 发布,引入 Qt Quick / Qt 5.0 released with Qt Quick
2020 The Qt Company 上市 / The Qt Company goes public
2021 Qt 6.0 发布 / Qt 6.0 released
2025 Qt 6.8+ 支持 CMake 构建为默认 / Qt 6.8+ CMake as default

Qt 最初诞生于挪威,名字来源于 “Q”(字母设计美观)+“t”(toolkit)。 Qt was born in Norway; the name comes from “Q” (beautiful letter) + “t” (toolkit).

GTK 发展历程

年份 / Year 里程碑 / Milestone
1997 GIMP ToolKit 诞生,为 GIMP 图像编辑器而生 / Born for GIMP
1999 GNOME 选择 GTK 作为官方工具包 / GNOME adopts GTK
2002 GTK 2.0 发布,引入主题引擎 / GTK 2.0 with theme engine
2011 GTK 3.0 发布,支持 CSS 样式 / GTK 3.0 with CSS styling
2020 GTK 4.0 发布,全新渲染架构 / GTK 4.0 with new rendering
2022 libadwaita 1.0 发布,GNOME 现代化 / libadwaita 1.0 for GNOME
2025 GTK 4.16+ 持续改进 / GTK 4.16+ continuous improvements

GTK 原名 “The GIMP Toolkit”,后来缩写为 GTK。 GTK originally stood for “The GIMP Toolkit”, later shortened to GTK.


1.2 设计理念 / Design Philosophy

Qt 的设计理念

Qt 的核心哲学可以用四个关键词概括:

理念 / Principle 说明 / Description
“Write Once, Run Everywhere” 一次编写,到处运行 / Cross-platform by design
信号与槽 (Signals & Slots) 类型安全的观察者模式 / Type-safe observer pattern
属性系统 (Property System) 运行时反射与动态属性 / Runtime reflection & dynamic properties
元对象系统 (Meta-Object) 编译期代码生成 / Compile-time code generation (moc)
// Qt 的哲学:优雅的 C++ 扩展
// Qt philosophy: elegant C++ extension
class Counter : public QObject {
    Q_OBJECT
    Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)

public:
    int value() const { return m_value; }

public slots:
    void setValue(int v) {
        if (m_value != v) {
            m_value = v;
            emit valueChanged(v);
        }
    }

signals:
    void valueChanged(int newValue);

private:
    int m_value = 0;
};

GTK 的设计理念

GTK 遵循 GNOME 生态的设计原则:

理念 / Principle 说明 / Description
GObject 类型系统 C 语言实现的面向对象 / OOP in C via GObject
信号机制 (Signals) 运行时信号连接 / Runtime signal connections
CSS 样式 使用 CSS 控件外观 / CSS-based widget styling
自由软件 完全开源 / Completely free software
/* GTK 的哲学:C 语言的面向对象 */
/* GTK philosophy: OOP in C */
typedef struct {
    GtkApplication parent;
} MyApp;

G_DEFINE_TYPE(MyApp, my_app, GTK_TYPE_APPLICATION)

static void my_app_activate(GApplication *app) {
    GtkWidget *window = gtk_application_window_new(GTK_APPLICATION(app));
    gtk_window_set_title(GTK_WINDOW(window), "Hello");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
    gtk_window_present(GTK_WINDOW(window));
}

static void my_app_class_init(MyAppClass *klass) {
    G_APPLICATION_CLASS(klass)->activate = my_app_activate;
}

1.3 许可证对比 / License Comparison

这是技术选型中最关键的因素之一。 This is one of the most critical factors in technology selection.

框架 / Framework 默认许可证 / Default License 商业选项 / Commercial
Qt (开源版) LGPLv3 / GPLv3 ❌ 需遵守 LGPL 条款
Qt (商业版) 商业许可 / Commercial ✅ 闭源开发
GTK LGPLv2.1+ ✅ 可闭源使用

LGPLv3 的关键限制 / Key LGPLv3 Restrictions

允许 / Allowed 限制 / Restricted
✅ 动态链接闭源软件 / Dynamic linking ❌ 静态链接闭源软件 / Static linking
✅ 修改 Qt 源码自用 / Modify for own use ❌ 不提供修改后的源码 / Must provide source
✅ 商业项目使用 / Use in commercial projects ❌ 不允许修改后闭源分发 / No closed distribution of modified Qt

实际影响 / Practical Impact

商业闭源项目 + 动态链接 Qt = ✅ 合法
Commercial + Dynamic link Qt = ✅ Legal

商业闭源项目 + 静态链接 Qt = ❌ 违反 LGPL
Commercial + Static link Qt = ❌ Violates LGPL

商业闭源项目 + 购买 Qt 商业许可 + 静态链接 = ✅ 合法
Commercial + Qt commercial license + Static link = ✅ Legal

开源项目 + LGPL/GPL = ✅ 合法
Open source + LGPL/GPL = ✅ Legal

任何项目 + GTK (LGPLv2.1+) = ✅ 合法
Any project + GTK = ✅ Legal

1.4 生态系统对比 / Ecosystem Comparison

Qt 生态系统

组件 / Component 用途 / Purpose
Qt Widgets 传统桌面控件 / Traditional desktop widgets
Qt Quick / QML 声明式 UI,移动端友好 / Declarative UI, mobile-friendly
Qt Network 网络编程 / Network programming
Qt SQL 数据库抽象层 / Database abstraction
Qt WebEngine 嵌入 Chromium 浏览器 / Embedded Chromium
Qt Multimedia 音视频处理 / Audio/video processing
Qt 3D 3D 渲染 / 3D rendering
Qt Designer 可视化 UI 设计器 / Visual UI designer
Qt Creator 官方 IDE / Official IDE
Qt Linguist 国际化工具 / i18n tool

GTK 生态系统

组件 / Component 用途 / Purpose
GTK 4 核心控件库 / Core widget toolkit
libadwaita GNOME 现代化 UI / Modern GNOME UI
GStreamer 多媒体框架 / Multimedia framework
GLib 底层工具库 / Low-level utility library
GIO I/O 与网络 / I/O and networking
Pango 文本渲染 / Text rendering
Cairo 2D 图形 / 2D graphics
GDK 显示后端 / Display backend
GTK Inspector 运行时调试 / Runtime debugging

社区与支持 / Community & Support

指标 / Metric Qt GTK
GitHub Stars ~4k (qt/qtbase) ~5k (GNOME/gtk)
StackOverflow 问题数 ~130k+ ~25k+
包管理器支持 vcpkg, conan, apt apt, dnf, pacman
商业支持 ✅ Qt Company ❌ 社区驱动
学习曲线 中等 / Medium 较陡 / Steeper

1.5 典型应用案例 / Notable Applications

基于 Qt 的应用

应用 / Application 行业 / Industry 说明 / Description
KDE Plasma 桌面环境 Linux 主流桌面环境
VirtualBox 虚拟化 Oracle 虚拟机软件
OBS Studio 直播/录制 开源直播推流软件
VLC 多媒体 万能播放器
Wireshark 网络 网络协议分析器
WPS Office 办公 金山办公软件
Telegram Desktop 通讯 加密聊天客户端
Maya/Blender (部分) 3D 3D 建模工具

基于 GTK 的应用

应用 / Application 行业 / Industry 说明 / Description
GNOME 桌面 桌面环境 GNOME 桌面环境全套应用
GIMP 图像处理 开源 Photoshop 替代品
Inkscape 矢量图形 SVG 编辑器
Firefox (Linux) 浏览器 使用 GTK 原生集成
LibreOffice (部分) 办公 Linux 集成
Geany IDE 轻量级编辑器
File Roller 文件管理 GNOME 归档管理器

1.6 技术选型指南 / Technology Selection Guide

决策矩阵 / Decision Matrix

需求 / Requirement 推荐 / Recommended 原因 / Reason
跨平台桌面 (Win/Mac/Linux) Qt Qt 跨平台能力更成熟
仅 Linux 桌面 GTK GNOME 生态原生支持
移动端 (Android/iOS) Qt GTK 不支持移动端
嵌入式设备 Qt Qt for Embedded 更成熟
商业闭源项目 GTK 或 Qt 商业版 GTK 无许可证限制
开源 GNOME 应用 GTK + libadwaita GNOME HIG 原生支持
开源 KDE 应用 Qt KDE 原生工具包
快速原型开发 Qt + QML QML 声明式 UI 快速迭代
Python 快速开发 PyQt/PySide 或 PyGObject 取决于目标平台

流程图决策 / Decision Flowchart

你的项目需要跨平台吗? / Cross-platform?
├── 是 / Yes
│   ├── 需要移动端? / Mobile needed?
│   │   ├── 是 → Qt (QML + Qt Quick)
│   │   └── 否 → Qt Widgets
│   └── 需要嵌入式? / Embedded?
│       └── 是 → Qt for Embedded
└── 否 / No
    ├── 目标平台是 Linux? / Target is Linux?
    │   ├── 是 → 用 GNOME 还是 KDE? / GNOME or KDE?
    │   │   ├── GNOME → GTK4 + libadwaita
    │   │   └── KDE → Qt Widgets
    │   └── 否 → Qt (Windows/macOS)
    └── 许可证限制? / License constraint?
        └── 需要闭源分发 → GTK 或 Qt 商业版

性能对比 / Performance Comparison

指标 / Metric Qt 6 GTK 4
启动速度 / Startup 快 / Fast 中等 / Medium
内存占用 / Memory 中等 / Medium 低 / Low
渲染性能 / Rendering 优秀 (OpenGL/Vulkan) 良好 (GSK)
控件数量 / Widget Count ~100+ ~80+
二进制大小 / Binary Size 较大 / Larger (~20MB+) 较小 / Smaller (~5MB)

1.7 开发工具对比 / Development Tools

工具 / Tool Qt GTK
官方 IDE Qt Creator GNOME Builder
UI 设计器 Qt Designer / Qt Design Studio Cambalache / Glade (GTK3)
调试工具 Qt Inspector, GammaRay GTK Inspector
文档质量 ⭐⭐⭐⭐⭐ 极佳 ⭐⭐⭐⭐ 良好
构建系统 CMake (推荐) / qmake Meson (推荐)
包管理 vcpkg / conan 系统包管理器

Qt Designer 示例 / Qt Designer Example

Qt 提供所见即所得的 UI 设计器,生成 .ui 文件: Qt provides a WYSIWYG UI designer generating .ui files:

<!-- mainwindow.ui (简化版) -->
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
   <property name="geometry">
     <rect><x>0</x><y>0</y><width>400</width><height>300</height></rect>
   </property>
   <widget class="QWidget" name="centralwidget">
     <widget class="QPushButton" name="pushButton">
       <property name="text"><string>点击我</string></property>
     </widget>
   </widget>
 </widget>
</ui>

注意事项 / Important Notes

⚠️ 许可证陷阱 / License Pitfall

使用 Qt 开源版时,静态链接会导致整个项目必须开源。 确保使用动态链接以满足 LGPLv3 要求。

When using open-source Qt, static linking forces your project to be open-source. Use dynamic linking to comply with LGPLv3.

⚠️ 版本选择 / Version Choice

  • Qt: 推荐使用 Qt 6.6+,Qt 5 已停止维护

  • GTK: 推荐使用 GTK 4.x,GTK 3 仅做维护

  • Qt: Use Qt 6.6+, Qt 5 is EOL

  • GTK: Use GTK 4.x, GTK 3 is maintenance-only

⚠️ 平台差异 / Platform Differences

Qt 在各平台表现一致,但 GTK 在 macOS/Windows 上体验较差。 GTK 主要面向 Linux,跨平台需求请优先考虑 Qt。

Qt is consistent across platforms, but GTK has poor macOS/Windows support. GTK is primarily for Linux. Choose Qt for cross-platform needs.


业务场景总结 / Business Scenario Summary

场景 / Scenario 推荐方案 / Recommended
企业级跨平台桌面应用 Qt Widgets + C++
现代化触屏应用 Qt Quick (QML)
Linux GNOME 原生应用 GTK4 + libadwaita + C/Python
快速原型 + 脚本语言 PySide6 或 PyGObject
嵌入式 HMI 界面 Qt for Embedded
音视频/直播软件 Qt + GStreamer
开源图像处理工具 GTK4 + Cairo

扩展阅读 / Further Reading

资源 / Resource 链接 / Link
Qt 官方文档 https://doc.qt.io/qt-6/
Qt 示例代码 https://doc.qt.io/qt-6/qtexamples.html
GTK 官方文档 https://docs.gtk.org/gtk4/
GNOME 开发者中心 https://developer.gnome.org/
GNOME HIG https://developer.gnome.org/hig/
Qt 许可证 FAQ https://www.qt.io/licensing/
GTK 许可证 https://www.gtk.org/licensing/

下一章:02 - Qt 基础 / Qt Basics