2025 年 Rust GUI 库调查

主要观点:作者多次对不同 Rust GUI 库进行调研和测试,包括 Azul、cacao 等多个库,比较它们在 Windows 系统下的工作情况,如是否能正常运行、屏幕阅读器访问性、输入法(IME)支持等方面,并总结出各个库的优缺点及适用场景。
关键信息

  • 介绍了众多 Rust GUI 库,如 Azul、cacao 等,详细说明了它们的特点和遇到的问题。
  • 强调了在 Windows 系统下进行 GUI 开发的一些挑战,如不同库的兼容性、布局系统的不足等。
  • 提及了各个库在屏幕阅读器访问性和 IME 支持方面的表现,如有的库 Narrator 无法识别文本,有的库 IME 存在各种问题。
    重要细节
  • Azul 下载预构建的.dll 存在问题,版本标记混乱,代码示例在作者环境中无法运行。
  • cacao 是 macOS API 的子集,仅适用于 macOS,在 Windows 上不工作。
  • Core Foundation 同理,仅适用于 macOS。
  • Crux 实际上不支持桌面 GUI 开发,仅适用于移动和 Web。
  • Cushy 示例代码运行时会在 stderr 输出大量 Vulkan/DirectX 12 错误,Windows Narrator 无法识别窗口内容,但 IME 部分功能可用。
  • CXX-Qt 安装 Qt 需注册账号,示例代码因 1058 个链接器错误无法运行。
  • Dioxus 支持桌面开发通过 WebView2/WebKitGTK,示例代码运行良好,Narrator 能识别文本,IME 工作正常。
  • Dominator 是 Web 专用 UI 库,无桌面堆栈。
  • egui 设置简单,使用方便,Narrator 能识别文本,但默认字体无平假名和汉字覆盖。
  • Floem 构建布局方式独特,缺乏访问性和 IME 支持。
  • fltk 布局子系统存在问题,手动定位和自动布局都不理想,IMEX 作正常。
  • flutter_rust_bridge 设置较易,但存在输入字段反向输入等问题,Narrator 能识别部分文本。
  • Freya 基于 Dioxus,渲染方式不同,Narrator 能识别文本标签但文本输入存在问题。
  • fui 文档不足,无法构建fui_system
  • GemGui 依赖 Python 且设置复杂,作者对其列入列表表示疑惑。
  • GPUI 文档稀少,安装繁琐,标准库不足,但 Windows 上运行良好。
  • GTK 3 已停止维护,GTK 4 在 Windows 上安装方便但存在窗口装饰和访问性问题。
  • Iced 受 Elm 启发,Narrator 无法识别窗口内容,IME 无法激活。
  • imgui 开始使用较麻烦,窗口显示巨大空白,Narrator 无法识别文本,IME 拒绝激活。
  • KAS 教程过时,状态管理设计不易理解,Narrator 无法识别文本,IME 无法激活。
  • kittest 是 AccessKit 驱动的测试库,仅支持 egui。
  • Leptos 文档中关于原生 GUI 的 FAQ 说明不支持,且发送到 crates.io 的版本更新不及时。
  • lvgl 为 C GUI 库,在 Windows 上配置困难。
  • Makepad 版本发布和示例查找困难,缺乏文档,缺乏访问性支持。
  • masonry 最后发布于 11 个月前,直接指向main分支,存在一些显示和输入问题。
  • Maycoon 较新,无文本输入 widget,不可用。
  • Pax 仅支持 macOS,前端编辑器出现问题。
  • qmetaobject 不适用于windows-msvc目标。
  • relm 基于未维护的 GTK 3 绑定,安装存在问题。
  • Relm4 基于 GTK 4,架构较易使用,但继承 GTK 4 在 Windows 上的问题,宏调试困难。
  • Ribir 代码运行存在问题,Narrator 无法识别文本,IME 部分功能可用。
  • Rinf 不满足需求。
  • rui 状态管理稍显笨拙,缺乏访问性和 IME 支持。
  • Slint DSL 规则,Narrator 工作良好,IME 存在显示问题。
  • Tauri 架构存在问题,IPC 边界缺乏类型安全,导致诸多不便。
  • tinyfiledialogs 仅提供基本提示,无法完成当前任务。
  • Tk 安装困难,示例代码存在一些问题,如.insert()方法的使用等。
  • Vizia 结构有前景,但存在内部 padding 问题,Narrator 无法识别文本内容。
  • WebRender 是低级别图形库,不在 GUI 库范畴。
  • windows API 的 Rust 绑定未提及具体 GUI 开发方式。
  • WinSafe 手动定位存在问题,需要额外处理窗口创建事件。
  • Xilem 基于 masonry,存在屏幕阅读器位置错误和 IME 临时字符问题。

结论:Rust GUI 库众多,各有优缺点。Dioxus 适合喜欢 CSS 布局 quirks 的;Slint 适合喜欢 DSL 驱动 UI 和开发者工具的;egui 适合只想写常规 Rust 的;Freya 和 Xilem 适合早期投资但需忍受一些瑕疵的。同时指出没有超级简单明显正确的选择,且各个库都有需要改进的地方,如 Floem 和 iced 的访问性问题等。最后作者表示要进行cargo clean操作。

表格总结

libraryworks at all?screen reader accessible?IME works?
Azullinker hell
cacaomacOS-specific
core-foundationmacOS-specific
Cruxno desktop targets
Cushyyes!nopecomposer hidden, converter works
CXX-Qtlinker hell
Dioxusyes!yes!yes!
Dominatorweb-specific
eguiyes!yes!composer works, Tab press stolen from converter
Floemyes!nopenope
fltkyes!with extra crateyes!
flutter_rust_bridgekinda, but state hellyes!kinda, but state hell
Freyayes!mostly, but some content missingcomposer hidden, converter works
fuiqmake hell
GemGuitechnically
GPUIyes!nopeyes!
GTK 3unmaintained
GTK 4yes!nopeyes!
Icedyes!nopenope
imguiyes!nopenope
KASyes!nopenope
kittestonly for testing
Leptosweb-specific
lvglC dependency hell
Makepadyes!nopecomposer outside window, converter works
masonryyes!content but not positionyes! but some temporary tofu
Maycoonno text input widget
Paxno Windows support
qmetaobjectno windows-msvc
relmuses unmaintained GTK 3
Relm4yes!nopeyes!
Ribirkinda, but state hellnopecomposer hidden, converter works
Rinfdoes not use Rust for GUI
ruiyes!nopenope
Slintyes!yes!missing glyphs in provisional states but logic works and final kanji displayed correctly
Tauriyes!yes!composer outside window, converter works
tinyfiledialogsnot general-purpose
Tkyes!nopeyes!
Viziayes!structure but not contentconverter outside window, everything works
WebRendertoo low-level
windowsi don’t know Win32
WinSafeyes!yes!yes!
Xilemyes!content but not positionyes! but some temporary tofu
阅读 20
0 条评论