主要观点:作者多次对不同 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
操作。
表格总结:
library | works at all? | screen reader accessible? | IME works? |
---|---|---|---|
Azul | linker hell | ||
cacao | macOS-specific | ||
core-foundation | macOS-specific | ||
Crux | no desktop targets | ||
Cushy | yes! | nope | composer hidden, converter works |
CXX-Qt | linker hell | ||
Dioxus | yes! | yes! | yes! |
Dominator | web-specific | ||
egui | yes! | yes! | composer works, Tab press stolen from converter |
Floem | yes! | nope | nope |
fltk | yes! | with extra crate | yes! |
flutter_rust_bridge | kinda, but state hell | yes! | kinda, but state hell |
Freya | yes! | mostly, but some content missing | composer hidden, converter works |
fui | qmake hell | ||
GemGui | technically | ||
GPUI | yes! | nope | yes! |
GTK 3 | unmaintained | ||
GTK 4 | yes! | nope | yes! |
Iced | yes! | nope | nope |
imgui | yes! | nope | nope |
KAS | yes! | nope | nope |
kittest | only for testing | ||
Leptos | web-specific | ||
lvgl | C dependency hell | ||
Makepad | yes! | nope | composer outside window, converter works |
masonry | yes! | content but not position | yes! but some temporary tofu |
Maycoon | no text input widget | ||
Pax | no Windows support | ||
qmetaobject | no windows-msvc | ||
relm | uses unmaintained GTK 3 | ||
Relm4 | yes! | nope | yes! |
Ribir | kinda, but state hell | nope | composer hidden, converter works |
Rinf | does not use Rust for GUI | ||
rui | yes! | nope | nope |
Slint | yes! | yes! | missing glyphs in provisional states but logic works and final kanji displayed correctly |
Tauri | yes! | yes! | composer outside window, converter works |
tinyfiledialogs | not general-purpose | ||
Tk | yes! | nope | yes! |
Vizia | yes! | structure but not content | converter outside window, everything works |
WebRender | too low-level | ||
windows | i don’t know Win32 | ||
WinSafe | yes! | yes! | yes! |
Xilem | yes! | content but not position | yes! but some temporary tofu |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。