A 2025 Survey of Rust GUI Librariesに掲載されているライブラリのそれぞれの特徴や使い勝手、実装のしやすさ、アクセシビリティなどを紹介します。
評価ポイントについて
各ライブラリは以下の基準で評価されました:
- 動作するか - 基本的な機能が実装できるか
- スクリーンリーダー対応 - Windows Narratorで内容が読み上げられるか
- IME対応 - 日本語入力(IME)が正常に機能するか(「東京」と入力できるか)
- 実装の複雑さ - コードはどれだけ簡潔か
主なライブラリの比較と評価
1. Dioxus - WebViewベース
DioxusはReactに影響を受けた設計でWebViewを使用してデスクトップアプリケーションを構築します。元記事では、WebView2/WebKitGTKを通じて実装されていると説明されています。
let mut text = use_signal(|| "Hello, world!".to_string());
rsx! {
p { "{text}" }
input {
type: "text",
oninput: move |event| text.set(event.value()),
value: "{text}"
}
}
評価:
- スクリーンリーダー対応
- IME対応
- React風の構文
2. Slint - DSL駆動型
SlintはQTの近代版のような位置づけで、独自のDSLを使ってUIを定義します。デスクトップとWeb用途は無料、組み込み用途は有料というビジネスモデルが採用されています。
export component AppWindow inherits Window {
property <string> label: "Hello, world!";
VerticalBox {
Text {
text: root.label;
}
LineEdit {
text <=> root.label;
}
}
}
評価:
- スクリーンリーダー対応
- IME対応(一部制限あり)
-
<=>
による双方向データバインディング - C++, JS, Pythonからも利用可能
3. egui - 即時モード
eguiは即時モードGUIライブラリで、ゲーム開発などにも利用されています。
egui::CentralPanel::default().show(ctx, |ui| {
ui.label(&self.label);
ui.text_edit_singleline(&mut self.label);
});
評価:
- スクリーンリーダー対応
- IME変換時にTab押下で問題あり
- マクロに依存しないコード
4. Xilem - Druidの後継
XilemはDruidの後継フレームワークで、Masonryの上に構築されています。
struct State {
label: String,
}
fn app_logic(state: &mut State) -> impl WidgetView<State> + use<> {
flex((
label(state.label.clone()),
textbox(state.label.clone(), |state: &mut State, new_value| {
state.label = new_value;
}),
))
}
評価:
- スクリーンリーダーは内容を読めるが位置認識に問題あり
- IME対応(一部文字化けする場合あり)
- リリースバージョンはまだ整備段階
5. WinSafe - Windows専用
WinSafeはWin32 GUI APIのRustラッパーで、Windows専用アプリケーションのために設計されています。
let wnd = gui::WindowMain::new(
gui::WindowMainOpts {
title: "My window title".to_owned(),
size: (300, 150),
..Default::default()
},
);
let label = gui::Label::new(
&wnd,
gui::LabelOpts {
text: "Hello, world!".to_string(),
position: (20, 20),
..Default::default()
},
);
let field = gui::Edit::new(
&wnd,
gui::EditOpts {
text: "Hello, world!".to_string(),
position: (20, 50),
..Default::default()
},
);
評価:
- スクリーンリーダー対応
- IME対応
- 手動での位置指定が必要
- Windows専用
6. Tauri - Rust + WebView
TauriはElectronの代替として、システムのWebViewを利用したクロスプラットフォームアプリを作成します。Electronと異なりChromiumを同梱せず軽量です。
// Leptos Frontend
#[component]
pub fn App() -> impl IntoView {
let (label, set_label) = signal("Hello, world!".to_string());
let update_label = move |ev| {
let v = event_target_value(&ev);
set_label.set(v);
};
view! {
<p>{ move || label.get() }</p>
<input type="text" value={ move || label.get() } on:input=update_label />
}
}
評価:
- スクリーンリーダー対応
- IME入力状態が画面の隅に表示される問題
- フロントエンドとバックエンド間の通信に型安全性の問題
その他の調査したライブラリ
以下のライブラリは、一部の機能が不完全だったり、開発中だったとのこと:
基本動作するもの
fltk - 追加クレートでスクリーンリーダー対応、IME対応
Makepad - スクリーンリーダー非対応、IME部分対応
セットアップに問題があったもの
これらのライブラリにはセットアップ時に問題があったとされています:
- Azul: リンカーエラー
- CXX-Qt: リンカーエラー
- fui: qmakeエラー
- lvgl: C依存関係エラー
特定プラットフォーム専用
- cacao: macOS専用
- core-foundation: macOS専用
- Pax: macOS専用(Windowsサポート無し)
- qmetaobject: windows-msvc非対応
特定用途向け
- Crux: デスクトップ非対応
- Dominator: Web専用
- kittest: テスト専用
- Leptos: Web専用
- Maycoon: テキスト入力ウィジェット無し
- tinyfiledialogs: 汎用的でない
- WebRender: 低レベルすぎる
総評
元記事の著者によれば、Rustでのデスクトップアプリケーション開発における選択肢は、2021年と比較して改善されているとのことです。完璧な選択肢はまだないものの、いくつかの実用的なオプションが存在します。
特に注目すべきライブラリとして以下が挙げられています:
- Dioxus - WebViewベースでアクセシビリティも良好
- Slint - DSL駆動のUIで開発ツールも充実
- egui - マクロを使わない純Rustコードで記述可能
- Xilem - 将来有望な次世代フレームワーク
比較表
以下の表は、各ライブラリの主要な特性をまとめたものです:
ライブラリ | 基本動作 | スクリーンリーダー | IME対応 | 備考 |
---|---|---|---|---|
Dioxus | ✅ | ✅ | ✅ | WebViewベース |
Slint | ✅ | ✅ | ⚠️ | DSL駆動 |
egui | ✅ | ✅ | ⚠️ | 即時モード |
Xilem | ✅ | ⚠️ | ✅ | 発展中 |
WinSafe | ✅ | ✅ | ✅ | Windows専用 |
Tauri | ✅ | ✅ | ⚠️ | プロセス分離 |
Cushy | ✅ | ❌ | ⚠️ | |
Floem | ✅ | ❌ | ❌ | |
fltk | ✅ | ⚠️ | ✅ | 追加設定必要 |
GTK 4 | ✅ | ❌ | ✅ | |
Iced | ✅ | ❌ | ❌ | |
Masonry | ✅ | ⚠️ | ✅ | |
Vizia | ✅ | ⚠️ | ✅ |
✅: 対応、⚠️: 部分対応/制限あり、❌: 未対応
感想
結構知らないライブラリばかりで、tauriとeguiしか使ったことがありませんでした。DSL駆動のSlint興味あります。試してみようと思いました。