專注於 KDE/Qt 的科技公司 KDAB 一直在努力改進 Rust 與 Qt 工具包的整合,近日他們推出了 ,稱該工具可為 Qt 提供安全的 Rust 語言繫結。
Rust 擁有 C/C++ 欠缺的記憶體安全性,且擁有豐富的庫生態系統,可用於(反)序列化、非同步、解析不安全輸入、執行緒等,將這些 Rust 庫整合到 Qt 應用程式中將為 Qt 帶來大量安全優化。
但目前將 Rust 與 Qt 結合的解決方案都存在一些問題,比如僅提供對 C++ API 的直接存取而不是對 Rust 的直接繫結、C++ 和 Rust 之間的呼叫不安全,又或者沒有利用 Rust 強大的多執行緒保證或特性等等。
而據 KDAB 介紹,其新推出的 CXX-Qt 不是簡單地為現有的 C++ API 提供繫結,而是利用了 Qt 強大的物件導向和元物件系統,該庫允許在 Rust 中將新的 QObject 子類定義為模組,甚至可以像 QML 甚至 C++ 中的任何其他 QObject 一樣被範例化。
CXX-Qt 定義的每一個 QObject 都由兩部分組成:
- 一個基於 C++ 的 QObject 範例,儲存和公開屬性和可呼叫方法
- 一個實現任何可呼叫物件、管理內部狀態,並處理來自屬性或後臺執行緒的更改請求的 Rust 結構
然後 CXX-Qt 使用一個名為 的庫在 Rust 和 C++ 之間進行通訊,與普通繫結相比,CXX 在 Rust 和 C++ 之間建立了一座橋樑,它基於兩種語言的安全子集。CXX-Qt 通過使用過程宏隱藏了 CXX 橋的詳細資訊,還提供了一個常見的 Qt 型別庫,可以安全地跨過 C++ <-> Rust 橋,此外還為 Rust 後臺執行緒提供了通知和安全更新 Qt 執行緒上的 Qt 狀態的機制。
這種方法的缺點是 CXX-Qt 不提供一對一的繫結,因此,CXX-Qt 需要跨橋暴露和實現每一個特性。
需要注意的是,CXX-Qt 目前不是穩定、可用於生產的版本。目前,現有程式碼能夠執行以下任務:
- 定義屬性和可呼叫物件,將它們暴露在 QObject 上
- 使用常見的 Qt 型別
- 監聽屬性更改或處理來自後臺 Rust 線程的更新請求
未來計劃新增以下任務/功能:
- 其他 Qt 基礎類別(如 QAbstractItemModel)
- 穩定宏的 API,改進 Qt 型別的 API
- 定義和發出訊號
- 擴充套件檔案,以包含教學和範例
感興趣的朋友可在其 檢視進度。