一些GUI框架的评估和讨论

参考 Philippe Groarke 的文章,仅针对个人开发者提供一些GUI选择建议。

[!Error]警告

  1. 以下均为个人主观评价
  2. 以Windows平台GUI框架为主,也列出包含Windows在内的跨平台方案
  3. 仅列出我熟悉或者了解的GUI框架,如有遗漏,希望大家补充
  4. 本来想发布成wiki贴,不过不知道怎么做,就这样吧

Qt

Qt 拥有您所需的一切,可助您快速高效地设计、开发、测试、部署和维护任何项目的软件。专注于打造最佳用户体验,而不是重复编写已有的代码。

  • 主要开发语言:C++
  • 平台:跨平台
  • License:Commercial / GPL3 & LGPL3
  • 风格:自绘 / 现代
  • 优点:
    1. 久经沙场
    2. 强大的 IDE 和 UI Builder
    3. 很多 C++ 程序员推崇它
    4. 它确实有你所需的一切
  • 缺点:
    1. 巨大而沉重的框架
    2. 使用旧范式
    3. 全家桶
    4. 慢
    5. 我不喜欢
  • 简评:
    如果你不介意发布时带着一堆动态链接库的话,Qt确实是万能的。

MFC (Microsoft Foundation Class)

MFC 是微软早期推出的 C++ 封装库,深深植根于 Win32 API 架构中,是许多老旧 Windows 桌面软件的历史遗留选择。

  • 主要开发语言:C++
  • 平台:仅 Windows
  • License:专有(随 Visual Studio 提供)
  • 风格:原生
  • 优点:
    1. 久经沙场
    2. Visual Studio集成
    3. 资料丰富
  • 缺点:
    1. 宏
    2. 过时的 C++ 编程习惯
  • 简评:
    今昔是何年?

WTL (Windows Template Library)

WTL 是基于 ATL 的轻量级 C++ 模版库,旨在为 Win32 界面开发提供比 MFC 更高效、更轻量级的封装。

  • 主要开发语言:C++
  • 平台:仅 Windows
  • License:MS-PL (Microsoft Public License)
  • 风格:原生
  • 优点:
    1. Header only
    2. 基于 C++ 模板,运行效率和打包体积约等于win32api
  • 缺点:
    1. C++ 模板
    2. 上手难度高
  • 简评:
    我宁愿选择win32api。

win32++

win32++ 是一个现代化的、仅包含头文件的 C++ 库,旨在对 Win32 API 进行直接且清晰的面向对象封装,是 MFC 的轻量级替代品。

  • 主要开发语言:C++
  • Platform:仅 Windows
  • License:MIT
  • 风格:原生
  • 优点:
    1. Header only
    2. 运行效率和打包体积约等于win32api
  • 缺点:
    1. 上手难度高
  • 简评:
    一个很不错的MFC/win32api/WTL替代品。

wxWidgets

wxWidgets 是一个让 C++ 开发者能够为多个平台创建原生界面外观的 GUI 库。

  • 主要开发语言:C++
  • 平台:跨平台
  • License:wxWindows Library Licence (LGPL 衍生版本,允许商业闭源静态链接)
  • 风格:原生
  • 优点:
    1. 久经沙场
    2. 许可证极其友好
    3. 拥有 wxFormBuilder 等第三方可视化设计工具
    4. 在各平台使用原生外观
  • 缺点:
    1. 复杂的API
  • 简评:
    很好很强大。

Sciter

Sciter 是一个轻量级、高性能的嵌入式 HTML/CSS/JS (TIScript/JSX) UI 引擎,专为桌面应用界面设计。

  • 主要开发语言:C++ (引擎提供 C/C++ API)
  • 平台:跨平台
  • License:Commercial / 免费版有功能限制
  • 风格:现代
  • 优点:
    1. 久经沙场
    2. HTML、CSS、JS
    3. 内存占用和体积远小于 Electron和webview2等方案
    4. 易于使用,并提供许多高级UI功能
    5. DOM检查器
  • 缺点:
    1. 不开源,但二进制文件可免费获取
    2. 文档不够完善
    3. 工具生态系统陈旧停滞
  • 简评:
    相比webview方案强过不少。

Dear ImGui

Dear ImGui 是一个即时模式的 C++ 实时图形界面库,专为游戏引擎、工具和调试面板设计。

  • 主要开发语言:C++
  • 平台:跨平台
  • License:MIT
  • 风格:自绘
  • 优点:
    1. 久经沙场
    2. 无外部依赖,代码极其易读且容易扩展
  • 缺点:
    1. 没有可视化UI设计器
  • 简评:
    即时模式的最佳选择。

GTK

GTK 是 Linux/GNOME 桌面环境的核心 UI 框架。

  • 主要开发语言:C
  • 平台:跨平台
  • License:LGPL
  • 风格:自绘
  • 优点:
    1. 久经沙场
    2. Linux平台下的事实标准
  • 缺点:
    1. 在 Windows 平台上的视觉体验较差
    2. API版本间不兼容变动较多
    3. 使用C模拟面向对象
  • 简评:
    你确定要用C来写GUI?

raygui

raygui 是专门为 raylib 游戏编程库设计的简单易用的立即模式(Immediate Mode)GUI 库。

  • 主要开发语言:C (易于在 C++ 中使用)
  • 平台:跨平台
  • License:zlib/libpng
  • 风格:自绘
  • 优点:
    1. 简单
    2. 漂亮
    3. 很多小部件
    4. 易于上手
  • 缺点:
    1. “raygui 旨在用于工具开发”
  • 简评:
    即时模式的又一选择。

FLTK (Fast Light Toolkit)

FLTK 是一个极其轻量级、跨平台的 C++ GUI 工具包,专注于小巧与快速。

  • 主要开发语言:C++
  • 平台:跨平台
  • License:LGPL (带有静态链接例外条款)
  • 风格:经典
  • 优点:
    1. 轻量
    2. UI Builder
  • 缺点:
    1. 丑
  • 简评:
    丑

IUP

IUP 是一个跨平台的 C 语言 GUI 工具包,通过抽象底层操作系统 API 来提供原生界面。

  • 主要开发语言:C (可用于 C++)
  • 平台:跨平台
  • License:MIT
  • 风格:原生
  • 优点:
    1. 原生外观
    2. 轻量
    3. 和Lua工作得很好
  • 缺点:
    1. SourceForge!?
    2. 折磨程序员
  • 简评:
    你确定要用C来写GUI?

WinForms (Windows Forms)

WinForms 是微软基于 Win32 API 封装的 C# 桌面 UI 框架,是 .NET 早期最流行的桌面开发工具。

  • 主要开发语言:C#
  • 平台:仅 Windows
  • License:MIT (.NET Core 开源版本)
  • 风格:原生
  • 优点:
    1. C# 下的VB
    2. 拥有 Visual Studio 中最成熟、最流畅的 UI 拖拽设计器
  • 缺点:
    1. 不支持现代化布局与 DPI 缩放适配能力较差
    2. 架构陈旧,不适应现代化 MVVM 设计模式
  • 简评:
    Old but gold, C#下的RAD最佳选择

WPF (Windows Presentation Foundation)

WPF 是微软推出的基于矢量渲染与 XAML 的现代 Windows 桌面应用程序框架。

  • 主要开发语言:C#
  • 平台:仅 Windows
  • License:MIT (.NET Core 开源版本)
  • 风格:现代
  • 优点:
    1. MVVM
    2. 基于 XAML 与 DirectX 渲染,支持高度灵活的样式、模板和动画自定义
    3. 第三方现代 UI 控件库
  • 缺点:
    1. XAML
  • 简评:
    介于WinForms和Avalonia之间,不上不下

Avalonia

Avalonia 是一个开源的、跨平台的 .NET UI 框架,支持 XAML 和现代化的 C# UI 开发,通常被视为跨平台版的 WPF。

  • 主要开发语言:C#
  • 平台:跨平台
  • License:MIT
  • 风格:现代
  • 优点:
    1. 跨平台
    2. 从WPF迁移成本低
  • 缺点:
    1. 生态比不上WPF
  • 简评:
    升级版WPF

WinUI 3

WinUI 3 是微软官方最新的 Native Windows UI 库,代表着 Windows 桌面开发的未来方向。

  • 主要开发语言:C# / C++ (WinRT)
  • 平台:仅 Windows
  • License:MIT / 专有
  • 风格:现代
  • 优点:
    1. Fluent Design
    2. “WinUI 3 是用于构建新的Windows 桌面应用程序的推荐原生UI 框架。”
  • 缺点:
    1. 半成品
    2. 不兼容旧版本 Windows 系统
  • 简评:
    未来可期!(现在就别碰了)

CEF/Electron

CEF 是一个简单的框架,用于将基于Chromium的浏览器嵌入到其他应用程序中。

  • 主要开发语言:html/Js
  • 平台:跨平台
  • License:MIT
  • 风格:现代
  • 缺点:
    1. 巨大的
    2. 你真的想在UI中嵌入一个Chromium内核吗?
  • 简评:
    别碰!

WebView2

WebView2 控件允许在原生 Windows 应用程序中嵌入 Web 技术),使用 Microsoft Edge 作为底层渲染引擎。

  • 主要开发语言:C++ / C#
  • 平台:Windows
  • License:专有
  • 风格:现代
  • 优点:
    1. HTML、CSS、JS
    2. 打包体积小
  • 缺点:
    1. 运行时内存仍较大
    2. 依赖系统的WebView2运行时
  • 简评:
    比CEF/Electron方案也就打包体积小了点

Duilib

Duilib 是 Windows 平台下久负盛名的开源 C++ 界面库,使用 XML 描述界面布局,主要通过 DirectUI 思想和 GDI/GDI+ 绘图实现自定义换肤。

  • 主要开发语言:C++
  • 平台:仅 Windows
  • License:MIT / BSD
  • 风格:自绘
  • 优点:
    1. 轻量高效
    2. 支持换肤
  • 缺点:
    1. 过时的
    2. XML+贴图
  • 简评:
    你打算分一半coding的时间在Photoshop上吗?

WebUI

WebUI 是一个极其轻量级的 C/C++ 库,允许开发者使用任何网页前端技术作为客户端界面,同时后台与原生的 C/C++ 等代码进行高效交互。

  • 主要开发语言:C / C++ /多语言绑定
  • 平台:跨平台
  • License:MIT
  • 风格:现代
  • 优点:
    1. 轻量
    2. 使用简单
  • 缺点:
    1. 用户体验和传统应用程序差别较大
  • 简评:
    似乎有点非主流,不过管他呢,好用就行

Lazarus

Lazarus 是基于 Object Pascal 语言的经典 RAD(快速应用开发)GUI 解决方案。

  • 主要开发语言:Object Pascal
  • 平台:跨平台
  • License:GPL & LGPL (Lazarus)
  • 风格:原生
  • 优点:
    1. RAD
  • 缺点:
    1. Pascal
  • 简评:
    不是C#害了你,是这个乱世害了你鸭!

Flutter

Flutter 是由 Google 开发的开源 UI 工具包,允许使用单一代码库为移动设备、Web 和桌面端(Windows, macOS, Linux)构建跨平台应用。

  • 主要开发语言:Dart
  • 平台:跨平台
  • License:BSD
  • 风格:自绘 / 现代
  • 优点:
    1. 真·跨平台,各平台视觉和动画效果高度一致
    2. 热重载
  • 缺点:
    1. Dart
    2. });});},),);}
  • 简评:
    你需要一个带彩虹括号功能的IDE
5 个赞

不错啊
补充一下WPF、WinForm等等也是可以用VB.Net开发的,不过大概是没多少人这么用了


Win32 API <---------------------------------------> WinUI 3
Windows的GUI框架还真的是不讨喜啊,从左到右都没有爽的
这难道是C/C++的锅吗 哈哈

macOS上我已经梭哈SwiftUI了,很爽,够现代

Qt API 的版本间变动也不小了

Windows 不得不提一下webView2,等同CEF和Election,优势是可以减少安装包的尺寸

之前有些国产软件的installer是用 GitHub - duilib/duilib · GitHub 写的。当然,这个GUI框架只适用于Windows操作系统。

1 个赞

要不老古董,要不半成品

既然有AI了,何不加入rust神教,使用Tauri一次性开发跨5平台的应用呢?

虽然编译出来不大,但是编译一次会发现项目文件夹会膨胀到十几G

因为空间换时间了……好在cargo clean可以直接删

tauri谨慎入坑,各个api都不完善,而且由于webview的缘故,低端设备上系统资源占用很大,我还写过插件来着,最后demo在我那台surface go3上卡得飞起,直接放弃了

这个本质还是web技术栈的。
不如让ai手搓gpui之类的框架了

啊有这么夸张吗,难道不是你的surface go3能运行Edge就能运行tauri?:thinking: