Rustは、開発者に「ソフトウェアを書く楽しさ」を本気で感じさせるという、非凡な成果を成し遂げました。しかし、実用的なユーザーインターフェースの構築となると、エコシステムはまだ発展途上にあります。IcedやeguiのようなRust UIフレームワークの選択肢は数多く存在し、注目を集めているものもあります。しかし、大半のUIフレームワークは、まだプロダクション環境での実績を積んでいる段階にあり、機能の豊富さという点では物足りなさが残ります。Rust向けにパブリックベータとして提供されているブリッジング技術「Qt Bridges」は、これとは一線を画すものです。30年以上にわたる実運用の実績、商用サポート、そして自動車のダッシュボードや医療機器、産業システムなど、世界中で既に稼働しているフレームワークという強みを備えています。Qt Bridge for Rustは、そうした成熟度をRust開発者にもたらします。Rustのコードベースを維持したまま、Qt Quickの機能豊富なUIライブラリやAPI、ハードウェアアクセラレーション、そして真のクロスプラットフォーム対応を利用できるUIフレームワークです。
QtをRustエコシステムにもたらそうとするこれまでの取り組みは、重要な礎を築いてきました。QMLとRustの統合が可能であることを実証した先駆的な取り組みであるqmetaobject-rsは、現在は消極的なメンテナンス状態にあるものの、今なお活発なユーザーコミュニティを有しています。また、優れたプロジェクトであるCXX-Qtは、すでにC++を中心に開発しているチーム向けに設計されています。一方で、システム開発、組み込み、クロスプラットフォームアプリケーションにおけるRustの需要は拡大を続けており、Rust開発者はバックエンドに見合ったUI層を必要としています。
Qt Bridges for Rustとは
Qt Bridgesは、単一のフロントエンド実装を複数のバックエンド言語で利用できるようにする、将来的なブリッジング技術です。Rustにおいては、既存のRust UIフレームワークに代わる、機能豊富でプロダクショングレードの選択肢を提供します。現在、Rustブリッジはパブリックベータとして提供されています。
Rustブリッジは、Rustのアプリケーションロジックを、自動車のダッシュボードや医療機器、産業用インターフェースなど世界中で採用されているQtの実績あるUIフレームワーク、Qt Quickに直接接続します。使用するのはRustのみです。C++のヘッダーも、手動でのFFIも、事前のQtの知識も必要ありません。Rustのコードを書けば、あとはブリッジが処理します。目指しているのは、Rust UIフレームワークの使用感を、見た目も、感触も、エラーの出方も、Rustそのものにすることです。UIはQtの宣言型言語であるQMLで記述し、動的なロジックにはJavaScriptを利用できます。これは、実行時の柔軟性よりもコンパイル時の保証を好むRust開発者にとって、必ずしもすぐに馴染むものではないかもしれません。しかし実際に使ってみると、非常に快適な体験であることがわかりました。UI側でのQMLによる素早い反復開発は、アプリケーションロジック側でのRustの厳格なコンパイル時保証と、意外なほど相性が良いのです。
両者の間では、属性マクロとトレイトをベースにしたミニマルなAPIによって、シームレスな連携を実現しています。特に興味深い課題の一つが、所有権とエイリアシングのモデルです。この点において、両言語はこれ以上ないほど異なります。それでも、このソリューションを、洗練されていながら実用的なものだと考えています。JavaScriptのオブジェクトモデルは、ネイティブなRustの型を用いて表現されます。各QMLオブジェクトは、共有参照であるRc<RefCell<T>>としてRustに公開され、借用ルールは実行時に強制されます。QMLエンジンは同じ共有参照を保持し、その関数を呼び出す際にはRustの不変条件に従う必要があります。Rustのエイリアシングモデルに違反するようなQMLの記述は、慣用的なQMLではほとんど発生しませんが、万一発生した場合は、エンジンが実行時に明確なエラーとして拒否します。この連携を実運用で確実かつスムーズなものにするために、多大な労力を注いでいます。
その結果得られるのは、アプリケーションロジック向けの完全に安全なRust APIと、C++で実装した場合と遜色ない性能を発揮するQML層です。ハードウェアアクセラレーション、標準対応のクロスプラットフォームサポート(Linux、macOS、Windows)、そしてRustにネイティブな使用感を持つ属性マクロ・トレイトベースのAPIまで、すべてが含まれています。
Qt BridgesがRust UIフレームワークとして機能する仕組み
RustとQMLを使ってアプリケーションを記述すると、Qt Bridges for Rustはコンパイル時に、Rustの型に対応したQtベースのネイティブなラッパーを生成します。このラッパーが、オブジェクトのインスタンス化、メソッド呼び出し、プロパティアクセス、シグナルの発行など、あらゆる相互運用処理を担います。これにより、以下の例のように、Rustの型をQMLから直接参照できるようになります。
|
Rust
|
QML
|
|
use qtbridge::{QApp, qobject};
#[derive(Default)]
pub struct Backend {
}
#[qobject]
impl Backend {
#[qslot]
fn say_hello(&self) {
println!("Hello World!");
}
}
|
import QtQuick
import QtQuick.Controls
import hello_world
ApplicationWindow {
visible: true
Backend { id: backend }
Button {
anchors.centerIn: parent
text: "Hello World!"
onClicked: backend.say_hello()
}
}
|
C++に関する処理はすべてqtbridgeクレート内にカプセル化されており、ユーザーがC++のコードを書いたり目にしたりすることは一切ありません。現在利用可能なRust UIフレームワーク向けQt Bridgesのバージョンでは、cargoがすべてのクレートをソースコードからビルドし直すため、C++コンパイラとツールチェーンが依然として必要です。この要件については、たとえばクレート内にビルド済みバイナリを提供するなどの方法で撤廃すべく、現在取り組んでいます。ユーザーコード自体は完全にC++フリーです。
Rustブリッジのはじめ方
Qt Bridgeは、ほぼ通常のRustクレートと変わりません。Cargo.tomlの依存関係にqtbridgeを追加し、いつも通りcargoでビルド・実行するだけです。通常のRustワークフローと唯一異なる点は、Qt BridgeがC++を基盤としていることを反映して、C++ツールチェーンとqmakeをPATH上で利用可能にしておく必要があることです。セットアップの詳細やプラットフォーム別の手順については、ドキュメントをご覧ください。
あとは、構造体に#[qobject]マクロを付与すれば、QMLから直接利用できます。実現可能なことについては、サンプルコードとドキュメントをご参照ください。Ubuntu 26.04または同様のLinuxディストリビューションを使用している場合、以下のコマンドですべての必要要件をインストールし、Hello Worldサンプルをダウンロード・実行できます。
|
# 1. Qt6の依存関係をインストール (Ubuntu 26.04)
sudo apt install -y qt6-base-dev qt6-declarative-dev qt6-base-private-dev
# 2. rustupでRustをインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env
# 3. サンプルリポジトリをクローン
git clone https://github.com/qt/qtbridge-rust-examples.git cd qtbridge-rust-examples/hello_world
# 4. qmakeを設定して実行
export QMAKE=qmake6 cargo run
|
IDEには、rust-analyzerとQt QMLプラグインを備えたVisual Studio Codeをお勧めします。ただし、これら2つのプラグインは現在、型情報を共有していないため、QMLファイル内でRustの型が認識されないように表示される点にご注意ください。これは既知の制限事項であり、解決に向けて取り組んでいます。
今後の展開
ぜひお試しいただき、ドキュメントで詳細をご確認のうえ、フィードバックをお寄せください。
現在、Rustブリッジを洗練させ、テクノロジープレビュー(TP)の状態に到達させるべく取り組みを進めています。
皆様からのフィードバックは、これを最良のRust UIフレームワークへと育てていくうえで非常に貴重ですので、ぜひお寄せください。ディスカッションにはQt Bridges Forumをご利用いただき、プロジェクトの最新情報を受け取るには登録をお願いいたします。