RustのGUIライブラリ総まとめ

[A 2025 Survey of Rust GUI Libraries](https://www.boringcactus.com/2025/04/13/2025-survey-of-rust-gui-libraries.html)に掲載されているライブラリのそれぞれの特徴や使い勝手、実装のしやすさ、アクセシビリティなどを紹介します。

### 評価ポイントについて

各ライブラリは以下の基準で評価されました：

1. **動作するか** - 基本的な機能が実装できるか
2. **スクリーンリーダー対応** - Windows Narratorで内容が読み上げられるか
3. **IME対応** - 日本語入力（IME）が正常に機能するか（「東京」と入力できるか）
4. **実装の複雑さ** - コードはどれだけ簡潔か

## 主なライブラリの比較と評価

### 1. Dioxus - WebViewベース

[Dioxus](https://dioxuslabs.com/)はReactに影響を受けた設計でWebViewを使用してデスクトップアプリケーションを構築します。元記事では、WebView2/WebKitGTKを通じて実装されていると説明されています。

```rust
let mut text = use_signal(|| "Hello, world!".to_string());
rsx! {
    p { "{text}" }
    input {
        type: "text",
        oninput: move |event| text.set(event.value()),
        value: "{text}"
    }
}
```

![Dioxusの実装例](https://www.boringcactus.com/assets/2025-04-13-dioxus.png)
*Dioxusで実装した例*

**評価：**
- スクリーンリーダー対応
- IME対応
- React風の構文

### 2. Slint - DSL駆動型

[Slint](https://slint.dev/)はQTの近代版のような位置づけで、独自のDSLを使ってUIを定義します。デスクトップとWeb用途は無料、組み込み用途は有料というビジネスモデルが採用されています。

```rust
export component AppWindow inherits Window {
    property <string> label: "Hello, world!";
    VerticalBox {
        Text {
            text: root.label;
        }

        LineEdit {
            text <=> root.label;
        }
    }
}
```

![Slintの実装例](https://www.boringcactus.com/assets/2025-04-13-slint.png)
*Slintの実装例*

**評価：**
- スクリーンリーダー対応
- IME対応（一部制限あり）
- `<=>` による双方向データバインディング
- C++, JS, Pythonからも利用可能

### 3. egui - 即時モード

[egui](https://www.egui.rs/)は即時モードGUIライブラリで、ゲーム開発などにも利用されています。

https://qiita.com/yonaka15/items/77c5249220b9d217669f

```rust
egui::CentralPanel::default().show(ctx, |ui| {
    ui.label(&self.label);
    ui.text_edit_singleline(&mut self.label);
});
```

![eguiの実装例](https://www.boringcactus.com/assets/2025-04-13-egui.png)
*eguiの実装例*

**評価：**
- スクリーンリーダー対応
- IME変換時にTab押下で問題あり
- マクロに依存しないコード

### 4. Xilem - Druidの後継

[Xilem](https://github.com/linebender/xilem/)はDruidの後継フレームワークで、Masonryの上に構築されています。

```rust
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;
        }),
    ))
}
```

![Xilemの実装例](https://www.boringcactus.com/assets/2025-04-13-xilem.png)
*Xilemの実装例*

**評価：**
- スクリーンリーダーは内容を読めるが位置認識に問題あり
- IME対応（一部文字化けする場合あり）
- リリースバージョンはまだ整備段階

### 5. WinSafe - Windows専用

[WinSafe](https://github.com/rodrigocfd/winsafe)はWin32 GUI APIのRustラッパーで、Windows専用アプリケーションのために設計されています。

```rust
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()
    },
);
```

![WinSafeの実装例](https://www.boringcactus.com/assets/2025-04-13-winsafe.png)
*WinSafeの実装例*

**評価：**
- スクリーンリーダー対応
- IME対応
- 手動での位置指定が必要
- Windows専用

### 6. Tauri - Rust + WebView

[Tauri](https://tauri.app/)はElectronの代替として、システムのWebViewを利用したクロスプラットフォームアプリを作成します。Electronと異なりChromiumを同梱せず軽量です。

```rust
// 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 />
    }
}
```

![Tauriの実装例](https://www.boringcactus.com/assets/2025-04-13-tauri.png)
*Tauriの実装例*

**評価：**
- スクリーンリーダー対応
- IME入力状態が画面の隅に表示される問題
- フロントエンドとバックエンド間の通信に型安全性の問題

## その他の調査したライブラリ

以下のライブラリは、一部の機能が不完全だったり、開発中だったとのこと：

#### 基本動作するもの

![Cushyの実装例](https://www.boringcactus.com/assets/2025-04-13-cushy.png)
*Cushy - スクリーンリーダー非対応、IME部分対応*

![Floemの実装例](https://www.boringcactus.com/assets/2025-04-13-floem.png)
*Floem - スクリーンリーダー非対応、IME非対応*

![fltkの実装例](https://www.boringcactus.com/assets/2025-04-13-fltk.png)
*fltk - 追加クレートでスクリーンリーダー対応、IME対応*

![GTK 4の実装例](https://www.boringcactus.com/assets/2025-04-13-gtk4.png)
*GTK 4 - スクリーンリーダー非対応、IME対応*

![Icedの実装例](https://www.boringcactus.com/assets/2025-04-13-iced.png)
*Iced - スクリーンリーダー非対応、IME非対応*

![Makepadの実装例](https://www.boringcactus.com/assets/2025-04-13-makepad.png)
*Makepad - スクリーンリーダー非対応、IME部分対応*

![Masonryの実装例](https://www.boringcactus.com/assets/2025-04-13-masonry.png)
*Masonry - スクリーンリーダー部分対応、IME対応*

![ruiの実装例](https://www.boringcactus.com/assets/2025-04-13-rui.png)
*rui - スクリーンリーダー非対応、IME非対応*

![Viziaの実装例](https://www.boringcactus.com/assets/2025-04-13-vizia.png)
*Vizia - スクリーンリーダー部分対応、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年と比較して改善されているとのことです。完璧な選択肢はまだないものの、いくつかの実用的なオプションが存在します。

特に注目すべきライブラリとして以下が挙げられています：

1. **Dioxus** - WebViewベースでアクセシビリティも良好
2. **Slint** - DSL駆動のUIで開発ツールも充実
3. **egui** - マクロを使わない純Rustコードで記述可能
4. **Xilem** - 将来有望な次世代フレームワーク

## 比較表

以下の表は、各ライブラリの主要な特性をまとめたものです：

| ライブラリ | 基本動作 | スクリーンリーダー | IME対応 | 備考 |
|------------|----------|-------------------|---------|------|
| Dioxus     | ✅       | ✅                | ✅      | WebViewベース |
| Slint      | ✅       | ✅                | ⚠️      | DSL駆動 |
| egui       | ✅       | ✅                | ⚠️      | 即時モード |
| Xilem      | ✅       | ⚠️                | ✅      | 発展中 |
| WinSafe    | ✅       | ✅                | ✅      | Windows専用 |
| Tauri      | ✅       | ✅                | ⚠️      | プロセス分離 |
| Cushy      | ✅       | ❌                | ⚠️      |  |
| Floem      | ✅       | ❌                | ❌      |  |
| fltk       | ✅       | ⚠️                | ✅      | 追加設定必要 |
| GTK 4      | ✅       | ❌                | ✅      |  |
| Iced       | ✅       | ❌                | ❌      |  |
| Masonry    | ✅       | ⚠️                | ✅      |  |
| Vizia      | ✅       | ⚠️                | ✅      |  |

✅: 対応、⚠️: 部分対応/制限あり、❌: 未対応


## 感想

結構知らないライブラリばかりで、tauriとeguiしか使ったことがありませんでした。DSL駆動のSlint興味あります。試してみようと思いました。