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

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
1991Haavard Nord 和 Eirik Chambe-Eng 创建 Qt / Qt created by Trolltech
1996Qt 1.0 发布,KDE 项目启动 / Qt 1.0 released, KDE project started
2008Nokia 收购 Trolltech / Nokia acquires Trolltech
2012Digia 从 Nokia 收购 Qt / Digia acquires Qt from Nokia
2014Qt 5.0 发布,引入 Qt Quick / Qt 5.0 released with Qt Quick
2020The Qt Company 上市 / The Qt Company goes public
2021Qt 6.0 发布 / Qt 6.0 released
2025Qt 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
1997GIMP ToolKit 诞生,为 GIMP 图像编辑器而生 / Born for GIMP
1999GNOME 选择 GTK 作为官方工具包 / GNOME adopts GTK
2002GTK 2.0 发布,引入主题引擎 / GTK 2.0 with theme engine
2011GTK 3.0 发布,支持 CSS 样式 / GTK 3.0 with CSS styling
2020GTK 4.0 发布,全新渲染架构 / GTK 4.0 with new rendering
2022libadwaita 1.0 发布,GNOME 现代化 / libadwaita 1.0 for GNOME
2025GTK 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✅ 闭源开发
GTKLGPLv2.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 3D3D 渲染 / 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
libadwaitaGNOME 现代化 UI / Modern GNOME UI
GStreamer多媒体框架 / Multimedia framework
GLib底层工具库 / Low-level utility library
GIOI/O 与网络 / I/O and networking
Pango文本渲染 / Text rendering
Cairo2D 图形 / 2D graphics
GDK显示后端 / Display backend
GTK Inspector运行时调试 / Runtime debugging

社区与支持 / Community & Support

指标 / MetricQtGTK
GitHub Stars~4k (qt/qtbase)~5k (GNOME/gtk)
StackOverflow 问题数~130k+~25k+
包管理器支持vcpkg, conan, aptapt, 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 (部分)3D3D 建模工具

基于 GTK 的应用

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

1.6 技术选型指南 / Technology Selection Guide

决策矩阵 / Decision Matrix

需求 / Requirement推荐 / Recommended原因 / Reason
跨平台桌面 (Win/Mac/Linux)QtQt 跨平台能力更成熟
仅 Linux 桌面GTKGNOME 生态原生支持
移动端 (Android/iOS)QtGTK 不支持移动端
嵌入式设备QtQt for Embedded 更成熟
商业闭源项目GTK 或 Qt 商业版GTK 无许可证限制
开源 GNOME 应用GTK + libadwaitaGNOME HIG 原生支持
开源 KDE 应用QtKDE 原生工具包
快速原型开发Qt + QMLQML 声明式 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

指标 / MetricQt 6GTK 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

工具 / ToolQtGTK
官方 IDEQt CreatorGNOME Builder
UI 设计器Qt Designer / Qt Design StudioCambalache / Glade (GTK3)
调试工具Qt Inspector, GammaRayGTK Inspector
文档质量⭐⭐⭐⭐⭐ 极佳⭐⭐⭐⭐ 良好
构建系统CMake (推荐) / qmakeMeson (推荐)
包管理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 HIGhttps://developer.gnome.org/hig/
Qt 许可证 FAQhttps://www.qt.io/licensing/
GTK 许可证https://www.gtk.org/licensing/

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