Qt Bridge 0.4 and Technology Preview
Qt Bridge 0.4, 기술 프리뷰 공개
Qt가 Rust와 C# 백엔드를 Qt Quick·QML UI에 연결하는 Qt Bridges를 기술 프리뷰로 공개했습니다. 핵심 기능은 프로토타입에 쓸 수 있지만 안정 버전 전까지 API와 지원 플랫폼, 요구 사항은 바뀔 수 있습니다.
- 주제
에디터 노트
Rust 브리지의 소유권 경계와 스레드 호출 기능은 구체적으로 제시됐지만, 실제 적용 판단에는 라이선스가 먼저 걸립니다. Qt 팀은 Rust의 정적 링크가 LGPL 적용에 미치는 영향을 검토 중이며 최종 방침을 밝히지 않았습니다. 댓글에서 언급한 이전 버전의 세그폴트는 사용자의 경험담이고 현재 프리뷰의 결함을 입증하지는 않습니다. 베타 이후 기능을 공개 평가하는 단계라는 설명과도 구분해야 합니다. 기존 코드 재사용을 내세운 도구인 만큼 안정 버전 전에는 API 변화와 라이선스 결정을 함께 확인할 필요가 있습니다.
AI 요약
Qt Bridges는 Rust 또는 C#으로 작성한 백엔드와 Qt Quick으로 만든 QML UI를 연결하는 도구입니다. 백엔드에서 UI에 노출할 타입을 지정하면 QML이 속성을 읽고 바인딩하며 메서드를 호출하고 시그널에 반응합니다. 별도의 연결 코드를 직접 작성하거나 Qt를 깊이 알 필요 없이 기존 코드베이스를 활용하는 것이 목표입니다. 다만 Qt API 전체를 감싸는 바인딩은 아니므로 네트워킹과 파일 입출력 등은 각 언어 생태계의 라이브러리를 계속 사용합니다.
기술 프리뷰의 범위
기술 프리뷰는 베타와 첫 안정 버전 사이 단계입니다. 핵심 기능은 프로토타입과 평가 프로젝트에 사용할 수 있지만 안정 버전이 나오기 전까지 API, 지원 플랫폼, 요구 사항은 바뀔 수 있습니다. 현재 데스크톱 플랫폼을 대상으로 하며 임베디드 지원은 추후 제공할 예정입니다.
Rust 브리지
Rust용 브리지는 속성 매크로와 트레이트를 사용합니다. #[qobject]로 구조체를 QML에 노출하고 #[qproperty], #[qslot], #[qsignal]로 속성, 슬롯, 시그널을 정의합니다. QML 컬렉션 바인딩과 Rust에서 QML 객체 트리를 만들고 조작하는 기능도 제공하며 tokio 런타임 같은 다른 스레드에서 메서드를 호출할 수 있습니다. QML 객체의 소유권은 Rc<RefCell<T>>에 대응하므로 경계 너머에서도 Rust의 대여 규칙이 적용됩니다. CXX-Qt와 기반을 공유해 두 브리지를 함께 사용할 수 있습니다.
C# 브리지와 개발 도구
C# 브리지는 기존 .NET 애플리케이션을 다시 작성하지 않고 Qt Quick UI를 덧붙이는 용도입니다. Windows에서는 Visual Studio 확장이 프로젝트·항목 템플릿과 NuGet 패키지 참조를 설정합니다. 프로젝트를 한 번 빌드하면 C# 타입을 위한 QML IntelliSense도 사용할 수 있습니다.
Visual Studio Code 확장은 플랫폼에 관계없이 Qt Extension for VS Code와 연동합니다. 다중 프로젝트 워크스페이스 검색, Qt 설치 경로 찾기, QML 언어 서버와 실시간 미리보기, 새 프로젝트의 QML 디버깅 설정을 지원합니다. 사용하려면 Qt Core 확장이 필요하며 Qt QML 확장과 C# Dev Kit도 권장합니다.
Reddit 반응
- @YW5vbl91c2Vy — 크레이트의 라이선스 요구 사항은 어떻게 될 예정인가요? 지금 상태라면 소스 사용에 상용 라이선스나 LGPL이 필요한 것 같습니다. cxx-qt 크레이트는 MIT라 그런 요구가 없고 C++에서는 동적 링크를 하므로 이 문제가 없습니다. Rust에서 가장 좋은 GUI 선택지가 될 가능성이 있어 꼭 쓸 수 있기를 바랍니다.
- @Matti_Qt — 좋은 말씀 감사합니다. Rust와 라이선스는 저희에게 새로운 분야입니다. C++에서는 LGPL로 사용자가 프레임워크 변경 사항을 공개하면서도 비공개 애플리케이션을 작성할 수 있다고 이해해 왔고 Rust에서도 같은 의도를 갖고 있었습니다. 하지만 Rust의 정적 링크가 라이선스 적용 방식을 바꾼다는 점을 알게 됐습니다. MIT도 Rust 크레이트와 함께 배포할 C++ 라이브러리에 어떤 의미가 될지 확신하기 어려워 현재 의도를 실현할 방법을 검토하고 있습니다.
- @Plane_Sherbert_6092 — 보드게임 모임에서 너무 기술적인 그림을 그린 것처럼 보입니다. Rust와 C#이 양쪽에 있고 사각형이 연결된 모습이 커피 세 잔을 마시고 점심을 거른 뒤 화이트보드에 그릴 법합니다. QThreadHandle이 이제 타입 안전하다는 점은 좋습니다. 예전 QmlMethodInvoker는 전기가 흐르는 수술 게임을 하는 듯한 느낌이었습니다. 지난달 이전 버전을 써봤는데 세그폴트 원인을 찾기가 꽤 까다로웠습니다. 기술 프리뷰로 경계 사례를 살펴본 뒤 안정화하는 방식은 합리적입니다. 날씨가 궂으면 주말에 묵혀 둔 사이드 프로젝트로 시험해 볼까 합니다.
- @Matti_Qt — 동의합니다. QThreadHandle은 예전 QmlMethodInvoker와 비교해 정말 좋게 느껴졌습니다. 사용해 주셔서 감사합니다.
원문: Qt blog / 번역·요약: Trawling