IVI 컴포저
IVI Compositor는 IviApplication 확장자를 사용하는 방법을 보여주는 예시입니다.
소개
이 예는 Wayland 디스플레이 서버에서 IviApplication 셸 확장자(Wayland 컴포저라고도 함)를 사용하는 방법을 보여줍니다.
Qt로 컴포지터를 만드는 기본 원리에 대한 소개는 Qt Wayland Compositor 를 만드는 기본 원리에 대한 소개는 Minimal Qt Qml 예제를 참조하세요.
프로토콜
IviApplication 은 차량 내 인포테인먼트 시스템을 만들기 위해 특별히 설계된 셸 확장입니다.
최소한의 프로토콜이며 다음과 같은 기능만 제공합니다:
- 클라이언트는 IVI-ID로 자신을 식별할 수 있습니다.
- 서버는 클라이언트가 스스로 크기를 조정하도록 요청할 수 있습니다.
식별 번호
일반적인 IviApplication 설정에서는 서버에 연결할 수 있는 미리 정의된 애플리케이션 세트가 있습니다. 이러한 애플리케이션은 시스템을 설계할 때 이미 알려져 있으므로 해당 애플리케이션을 식별하는 하드코딩된 번호를 할당할 수 있습니다. 클라이언트와 서버가 이러한 번호에 미리 동의하면 ID 번호에 의미를 부여할 수 있습니다.
예를 들어 클라이언트가 자신을 내비게이션 애플리케이션으로 식별하는 경우 서버는 이를 인식하고 화면 중앙의 큰 부분을 해당 창에 할당할 수 있습니다. 반면에 자신을 시계로 식별하는 애플리케이션은 화면 여백의 작은 영역에 위임될 수 있습니다.
기본적으로 Qt 애플리케이션은 시스템 PID("프로세스 ID")를 IVI-id로 광고합니다. 클라이언트는 서버에 연결하기 전에 자신의 환경에서 QT_IVI_SURFACE_ID
을 설정하여 이를 재정의할 수 있습니다.
예제
Qt Wayland Compositor 는 한 번에 여러 셸 확장을 지원할 수 있지만 IVICompositor 예제에서는 IviApplication 프로토콜만 지원합니다. 즉, 클라이언트가 서버에 연결하려면 이 셸 확장도 지원해야 합니다.
예시의 컴포저 창은 가로로 두 개로 나뉩니다: 왼쪽 영역은 아이디가 "1337"인 특수 애플리케이션을 위한 영역이고, 오른쪽 영역은 다른 모든 애플리케이션을 위한 영역입니다.
레이아웃 만들기
창의 레이아웃은 WaylandOutput. 일반적으로 컴포저에서 사용할 수 있는 실제 화면에 해당합니다. IVICompositor 예제에서와 같이 단일 WaylandOutput 이 생성되면 일반적으로 기본 화면에 해당합니다.
WaylandOutput { sizeFollowsWindow: true window: Window { width: 1024 height: 768 visible: true Rectangle { id: leftArea width: parent.width / 2 height: parent.height anchors.left: parent.left color: "cornflowerblue" Text { anchors.centerIn: parent text: "Ivi surface with id 1337" } } Rectangle { id: rightArea width: parent.width / 2 height: parent.height anchors.right: parent.right color: "burlywood" Text { anchors.centerIn: parent text: "Other surfaces" } } } }
이 코드는 화면에 WaylandOutput 을 생성하고 여기에 모든 컴포저 콘텐츠의 최상위 컨테이너로 창을 만듭니다. 이 창 안에는 애플리케이션이 연결될 때 컨테이너 역할을 하는 두 개의 직사각형이 생성됩니다.
클라이언트 연결
추가 구성이 수행되지 않은 경우, Qt 애플리케이션은 프로세스 ID와 동일한 IVI-id로 연결됩니다. 예를 들어, -platform wayland
로 다른 Qt 예제 애플리케이션을 실행하는 경우, 해당 애플리케이션의 ID가 "1337"과 다르므로 레이아웃의 오른쪽에 위임됩니다.
그러나 예제를 시작하기 전에 QT_IVI_SURFACE_ID
환경 변수를 "1337"로 설정하면 레이아웃의 왼쪽에 위임됩니다.
클라이언트가 IVIApplication
인터페이스에 연결하면 iviSurfaceCreated
신호를 전송합니다. 여기에서 애플리케이션 표면의 위치가 처리됩니다.
IviApplication { onIviSurfaceCreated: (iviSurface) => { var surfaceArea = iviSurface.iviId === 1337 ? leftArea : rightArea; var item = chromeComponent.createObject(surfaceArea, { "shellSurface": iviSurface } ); item.handleResized(); } }
iviSurfaceCreated
신호는 클라이언트 ID에 액세스하는 데 사용할 수 있는 IviSurface 인수를 받습니다. 그런 다음 컴포저는 chromeComponent
에 정의된 대로 표면을 위한 ShellSurfaceItem 을 생성합니다. ShellSurfaceItem
은 셸 표면을 Qt Quick 장면에 배치하는 데 사용되는 클래스이며, 모든 Qt Wayland Compositor 예제에서 동일한 패턴을 볼 수 있습니다.
IVICompositor 예제가 특별한 이유는 들어오는 셸 표면의 iviId
속성을 확인하고 이에 따라 ShellSurfaceItem 의 부모를 결정하기 때문입니다. ID가 "1337"과 같으면 leftArea
에 부모가 되고, 그렇지 않으면 rightArea
에 부모가 됩니다.
ShellSurfaceItem 의 구현은 크기가 변경될 때마다 클라이언트에게 알려줌으로써 크기 조정을 처리합니다(데스크톱 스타일 창 시스템 내에서 컴포저가 실행 중이고 창 크기가 조정되는 경우 발생할 수 있음).
onWidthChanged: handleResized() onHeightChanged: handleResized() function handleResized() { if (width > 0 && height > 0) shellSurface.sendConfigure(Qt.size(width, height)); }
sendConfigure()
메서드는 IviSurface 에 정의되어 있으며 클라이언트에 이벤트를 전송합니다. 클라이언트는 새 크기가 포함된 크기 조정 이벤트를 수신하여 콘텐츠를 릴레이 아웃할 수 있습니다.
여러 애플리케이션이 레이아웃의 동일한 영역에 연결되는 경우 일반적인 Qt Quick 순서 규칙에 따라 단순히 스택됩니다. 애플리케이션을 닫거나 상태를 관리하는 메커니즘은 내장되어 있지 않지만 일반 Qt Quick 코드로 쉽게 추가할 수 있습니다.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.