Qt Bridge for Rust (brand new official Qt-Rust bindings) discussion post
Rust에서 Qt Quick을 쓰는 공식 바인딩, Qt Bridge 공개 베타
Qt가 Rust 애플리케이션 로직과 Qt Quick UI를 연결하는 Qt Bridge for Rust 공개 베타를 소개했습니다. QML로 화면을 작성하고 Rust 타입을 직접 연결하며, Linux·macOS·Windows를 지원합니다. 다만 빌드에는 현재 C++ 툴체인과 qmake가 필요하고, 객체 공유 과정의 대여 규칙은 런타임에 검사합니다.
- 주제
AI 요약
Qt가 Rust 애플리케이션 로직과 Qt Quick 사용자 인터페이스를 연결하는 Qt Bridge for Rust를 공개 베타로 내놨습니다. Rust 코드는 그대로 두고 QML로 화면을 작성하며, Qt Quick의 UI 라이브러리와 API, 하드웨어 가속, 크로스 플랫폼 기능을 활용하는 방식입니다. Qt는 자동차 대시보드와 의료기기, 산업용 시스템에서 쓰여 온 Qt의 경험을 Rust 개발자에게 제공한다고 설명합니다.
기존 Rust UI 프레임워크와의 차이
Iced와 egui 등 Rust UI 프레임워크가 성장하고 있지만, Qt는 이들 프레임워크가 프로덕션 환경에서 아직 기능과 운영 경험을 쌓는 단계라고 봅니다. 과거 Rust와 Qt를 잇는 시도 중 qmetaobject-rs는 QML과 Rust의 연동 가능성을 보여줬지만 현재 유지보수는 활발하지 않습니다. CXX-Qt는 좋은 선택지지만 C++을 이미 쓰는 팀을 겨냥합니다. Qt Bridge는 C++을 애플리케이션 코드에서 직접 다루지 않는 Rust 개발자를 대상으로 합니다.
Qt Bridge는 여러 백엔드 언어에서 하나의 프런트엔드 구현을 활용하도록 만드는 Qt Bridges 기술의 일부입니다. 현재 Rust 브리지는 공개 베타이며, Qt는 이를 Technology Preview 단계로 다듬는 작업을 진행하고 있습니다.
Rust와 QML을 연결하는 방식
UI는 Qt의 선언형 언어인 QML로 작성하고, 동적 로직에는 JavaScript를 쓸 수 있습니다. Rust 쪽에서는 속성 매크로와 트레이트를 중심으로 API를 사용합니다. #[qobject] 매크로를 적용한 Rust 타입을 QML에서 객체로 참조하고, QML 버튼의 클릭 핸들러가 Rust 메서드를 호출하는 식입니다. Qt Bridge는 컴파일 시 Rust 타입용 Qt 래퍼를 생성합니다. 이 래퍼가 객체 생성, 메서드 호출, 속성 접근, 시그널 전달 같은 연결 작업을 맡습니다.
두 언어의 객체와 소유권 모델을 맞추는 일은 설계의 주요 과제입니다. Qt 설명에 따르면 QML 객체는 Rust에서 Rc<RefCell<T>> 형태의 공유 참조로 표현되며, 대여 규칙은 런타임에 검사합니다. QML 엔진도 같은 참조를 보유하고 Rust의 불변 조건을 지켜야 합니다. 일반적인 QML 코드에서는 Rust의 별칭 규칙과 충돌하는 구성이 대부분 나타나지 않으며, 충돌이 생기면 엔진이 런타임 오류를 냅니다. Qt는 이 연동을 실제 사용에서 안정적으로 만들기 위해 상당한 작업을 했다고 밝혔습니다.
애플리케이션 로직은 안전한 Rust API로 작성하고, QML 계층의 성능은 C++ 기반 Qt Quick과 비슷한 수준을 목표로 합니다. Linux, macOS, Windows를 지원하며 하드웨어 가속도 제공합니다. Rust의 컴파일 시점 보장과 QML의 빠른 UI 수정 주기를 함께 쓰는 구성을 Qt는 장점으로 제시합니다.
빌드 조건과 개발 환경
사용자는 Cargo.toml에 qtbridge를 추가하고 Cargo로 빌드·실행합니다. 다만 현재는 의존성 크레이트를 소스에서 다시 빌드하므로 C++ 컴파일러와 툴체인, qmake를 PATH에 설치해야 합니다. Qt는 향후 크레이트에 미리 빌드한 바이너리를 제공하는 등의 방법으로 이 요구사항을 없애려 합니다. 애플리케이션 코드 자체에는 C++을 작성하거나 직접 볼 필요가 없습니다.
Qt는 rust-analyzer와 Qt QML 플러그인을 설치한 Visual Studio Code를 IDE로 권장합니다. 두 플러그인은 아직 타입 정보를 공유하지 않으므로 QML 편집기에서 Rust 타입을 인식하지 못하는 제한이 있습니다. Qt는 이를 알려진 문제로 언급했습니다.
Reddit 반응
- @Shnatsel — 많은 Rust UI 프레임워크가 전역 가변 애플리케이션 상태와 borrow checker를 조율하는 데 어려움을 겪는데, 이 프로젝트도 상태 관리 해법이 뚜렷하지 않아 보입니다. Rc<RefCell<T>>는 런타임 패닉을 일으키기 쉬워 보입니다. 복잡한 데모에서 실제로 어떻게 다루는지 보고 싶습니다.
- @CrasseMaximum — 예제를 몇 개 살펴봤는데 Rc<RefCell<T>>는 보이지 않았습니다. 백엔드용 트레이트를 구현하면 내부 상태를 저장하는 듯합니다. 제가 빠르게 훑어서 놓친 걸 수도 있습니다.
- @Pantsman0 — 글에는 JavaScript 객체 모델을 Rust의 네이티브 타입으로 표현하며, QML 객체를 Rc<RefCell<T>> 공유 참조로 Rust에 노출하고 대여 규칙을 런타임에 검사한다고 나옵니다.
- @fisothemes — 저는 결국 Leptos CSR, Axum, Serde 조합에 정착했습니다. 일반 브라우저에는 디버깅 기능이 있고 충분히 검증됐습니다. 보통 사용자는 늘 브라우저를 열어 둡니다. SSR이나 Tauri는 크로스 컴파일이 복잡하고 운영체제 기본 브라우저도 별로라 피합니다. Iced가 가장 가능성에 가까워 보입니다.
- @chris-morgan — 이전 논의도 있습니다. Qt는 2025년 5월 27일 공식 Rust 바인딩인 Qt Bridges 작업을 알렸고, 해당 글은 점수 약 580점과 댓글 약 46개를 기록했습니다. 2026년 7월 1일 공개 베타 글은 약 78점과 댓글 약 36개를 기록했습니다.
- @hsivonen — Rust에서 LGPLv3의 재링크 조항을 지키려면 애플리케이션 소스 코드를 배포하는 방법 말고는 어렵다고 봅니다. C++보다 까다롭습니다.
- @Pantsman0 — 정적 링크 때문이라고 보는 건가요?
- @Dushistov — Qt를 프레임워크로 쓰는 건가요? 이벤트 루프 같은 기본 Qt 기능에 접근하는 방법이 보이지 않습니다. 이벤트 루프가 있다면 async/await 통합도 궁금합니다.
- @Shnatsel — QML과 Qt Quick만 쓰는 구성으로 보이지만 Tokio 통합 예제가 있습니다. 이를 이용해 비동기 작업을 쓸 수 있습니다.
- @ImZugzwang — 약 3개월간 사용했습니다. 예제의 색상 팔레트 같은 일부 패턴에는 함정이 있지만 바인딩 전반은 대체로 만족스럽습니다. QQuickImageProvider를 쓸 방법이 있으면 좋겠습니다. CXX-Qt에서는 가능할 것 같지만 자세히 살펴보진 않았습니다.
- @Helpful_Ad_9930 — 방금 Qt와 Rust를 함께 써 본 사람이 있는지 질문하려고 했습니다. 애니메이션 스튜디오 앱을 만들고 있습니다.
- @orfeo34 — 오늘 CXX-Qt 시작하기 튜토리얼을 따라 했고 작동했습니다. Qt가 Rust를 공식 지원한다면 더 좋겠습니다.
원문: Qt Blog / 번역·요약: Trawling