はじめに
この記事は Slint Advent Calendar 2025 4日目の記事です。
昨日は以下の記事を書きました。
今日は 2025年9月13日にリリースされた Slint 1.13 についてです。
Slint 1.13 リリース:Rust および C++ 向けライブプレビュー機能を搭載
本日 Slint 1.13 をリリースしました。Rust および C++ の開発サイクルにライブプレビューを導入し、ライブプレビューのサイドパネルをインタラクティブなアウトラインで拡張するとともに、Slint 言語にいくつかの開発体験向上のための機能を追加しました。
詳細を見ていきましょう。
Rust および C++ 向けライブプレビュー
長年にわたり、Slint は IDE プラグインでのライブプレビュー機能を提供してきました:.slint ファイルを編集すると、プレビューウィンドウで即座に変更を確認できます。一方、Rust や C++ アプリケーションとしてコンパイルする場合、Slint コンパイラがアプリケーションとリンクされるコードを生成します。.slint ファイルの変更を反映させるには、アプリケーションの再ビルド、再リンク、再起動が必要でした。
今回のリリースで、Rust および C++ 向けのライブプレビューを導入しました。ビルドシステムでこの機能を有効にし、アプリケーションを起動した状態で .slint ファイルを変更してエディタで保存してください。Slint のランタイムライブラリが変更を自動的に検出するため、再起動なしで UI が更新され、変更の確認できます。
コンパイル時に環境変数 SLINT_LIVE_PREVIEW=1 を設定し、Rust の場合は Cargo 向けの slint/live-preview を、C++ の場合は CMake で SLINT_LIVE_PREVIEW を有効にしてください。
内部では、Slint コンパイラが .slint ファイルのネイティブコード生成を、同一 API を持つスタブに置き換えます。これらのスタブはファイルシステム上の .slint ファイルの変更を監視し、必要に応じて再読み込みします。これによりコンパイル時間の短縮という副次効果も得られます。再読み込み時にはすべてのプロパティや、モデル、コールバックはそのまま保持されるため、アプリケーションロジックを透過的に扱うことができます。
サイドパネルのアウトライン機能対応
ライブプレビューのサイドパネルを再編成し、新しいアウトラインパネルを追加しました。選択可能な要素のツリービューを表示し、アウトラインツリー内またはキャンバスへ直接ドラッグ&ドロップで再配置できます。
ライブプレビュー UI での変更に対し、元に戻す / やり直し 機能も追加しました。
Slint 言語の改良
本リリースでは Slint 言語に複数の改良を加えました。その多くはコミュニティからの貴重な貢献によるものです。
ローカル変数
複雑な UI には複雑な式が必要となる傾向があります。Slint コード内の式や関数の可読性と保守性を高めるため、ローカル変数 のサポートを追加しました。コールバック、関数、バインディング式内で let を使用して宣言します。
これにより、プロパティを宣言してローカル変数のように扱うという一般的なパターンが置き換えられます。従来のプロパティはスコープが広く、コードの他の部分で意図せず使用される可能性がありました。
以下は let を使用した ダイヤルのサンプルコード です:
pointer-event(event) => {
let newAngle = AppState.normalizeAngle(...);
if event.kind == PointerEventKind.down {
if hovering {
lastAngle = newAngle;
}
} else if event.kind == PointerEventKind.move {
if touching {
nextAngle = AppState.normalizeAngle(...);
if nextAngle >= AppState.startAngle
|| nextAngle <= AppState.endAngle {
AppState.angle = nextAngle;
}
lastAngle = newAngle;
}
}
}
キーイベントのインターセプト
キーイベントはフォーカスされた要素に配信され、受け入れられない場合は親要素へと伝達していきます。今回のリリースでは、バブリングフェーズの前に新たな キャプチャフェーズ を導入しました:FocusScope の新しい capture-key-pressed と capture-key-releasedを 使用して、Windowからフォーカス要素へ伝わる途中のキーイベントをインターセプトできます。
例えば、LineEdit で上下キーを押した際にリストビューの選択を上下に移動することができるようになりました。
FocusScope {
VerticalBox {
search := LineEdit {
placeholder-text: "search";
edited(text) => {
root.filter_model(text);
}
}
list := StandardListView {
current-item: 0;
model: root.model;
}
}
// これは LineEdit の子がキー押下イベントを受信する前に呼び出されます。
capture-key-pressed(event) => {
if event.text == Key.UpArrow {
list.current-item = max(list.current-item - 1, 0);
return accept;
}
if event.text == Key.DownArrow {
list.current-item = min(list.current-item + 1, list.model.length - 1);
return accept;
}
reject
}
}
Timer の新しいヘルパー関数
タイマーコンポーネントは、単一の running プロパティを持つ最小限の API でした。使いやすさを向上させるため、start()、stop()、restart() の明示的なヘルパー関数を追加しました。
より多くのシンタックスシュガー
単一の式を持つコールバックや変更ハンドラーでは、中括弧が省略可能になりました:
clicked => { Logic.do-stuff(); } // 旧方式
clicked => Logic.do-stuff(); // 新方式も動作
円錐グラデーション
線形グラデーションと放射状グラデーションに加え、新たな @conic-gradient マクロが登場。シンプルな円グラフから複雑なカラーホイールまで、多様な視覚効果を実現します。
🛠️ その他の修正と改善
なんとこれ以外にも追加機能があります:
- メニュー項目にチェック機能とアイコンを付与可能に。Windowsではコンテキストメニューがネイティブの見た目と操作感に
- Slintソフトウェアレンダラーが放射状グラデーションをサポート(Tasukuさん、ありがとう)
- Python: slint.Image をバッファから作成可能に
- Python: 列挙型(enums)のサポートを追加
- C++: Windows ARM64のサポートを修正
- Rustのコンパイル時間を改善(抑制されるlintを生成するコードを生成しないようにした #8966)
全変更点の完全なリストは、ChangeLog をご覧ください。
おわりに
今回は Slint 1.13 のリリースを紹介しました。
このリリースに対して、上記に記載がある通り、マイコンでグラデーションを使いたかったので、対応をしました。
また、名前は載っていませんが、上記で紹介されている円錐グラデーションの対応も以下の通り行いました。
明日は Slint 1.14 のリリースを紹介します。


