3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

A 2025 Survey of Rust GUI Librariesに掲載されているライブラリのそれぞれの特徴や使い勝手、実装のしやすさ、アクセシビリティなどを紹介します。

評価ポイントについて

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

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

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

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}"
    }
}

Dioxusの実装例
Dioxusで実装した例

評価:

  • スクリーンリーダー対応
  • 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;
        }
    }
}

Slintの実装例
Slintの実装例

評価:

  • スクリーンリーダー対応
  • 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);
});

eguiの実装例
eguiの実装例

評価:

  • スクリーンリーダー対応
  • 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;
        }),
    ))
}

Xilemの実装例
Xilemの実装例

評価:

  • スクリーンリーダーは内容を読めるが位置認識に問題あり
  • 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()
    },
);

WinSafeの実装例
WinSafeの実装例

評価:

  • スクリーンリーダー対応
  • 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 />
    }
}

Tauriの実装例
Tauriの実装例

評価:

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

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

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

基本動作するもの

Cushyの実装例
Cushy - スクリーンリーダー非対応、IME部分対応

Floemの実装例
Floem - スクリーンリーダー非対応、IME非対応

fltkの実装例
fltk - 追加クレートでスクリーンリーダー対応、IME対応

GTK 4の実装例
GTK 4 - スクリーンリーダー非対応、IME対応

Icedの実装例
Iced - スクリーンリーダー非対応、IME非対応

Makepadの実装例
Makepad - スクリーンリーダー非対応、IME部分対応

Masonryの実装例
Masonry - スクリーンリーダー部分対応、IME対応

ruiの実装例
rui - スクリーンリーダー非対応、IME非対応

Viziaの実装例
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興味あります。試してみようと思いました。

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?