IVI Compositor
IVI Compositor는 IviApplication 확장 기능을 사용하는 방법을 보여주는 예제입니다.
소개
이 예제는 Wayland 디스플레이 서버(Wayland 컴포지터라고도 함)에서 IviApplication 셸 확장 기능을 사용하는 방법을 보여줍니다.
Qt를 사용하여 Qt Wayland Compositor 에 대한 소개는 Minimal Qml 예제를 참조하십시오.
이 프로토콜은
IviApplication 은 차량용 인포테인먼트 시스템 제작을 위해 특별히 설계된 셸 확장 기능입니다.
이 프로토콜은 최소한의 기능만을 제공하는 프로토콜로, 다음 기능만 지원합니다.
- 클라이언트는 IVI-id를 통해 자신을 식별할 수 있습니다.
- 서버는 클라이언트에 크기 조정을 요청할 수 있습니다.
식별 번호
일반적인 차량 내 인포테인먼트( IviApplication ) 설정에서는 서버에 연결할 수 있는 미리 정의된 애플리케이션 세트가 있습니다. 이러한 애플리케이션은 시스템 설계 시점에 이미 알려져 있으므로, 이를 식별하는 고정된 번호를 할당할 수 있습니다. 클라이언트와 서버가 이러한 번호에 대해 사전에 합의해 둔다면, ID 번호에 의미론적 정보를 반영할 수 있습니다.
예를 들어, 클라이언트가 자신을 내비게이션 애플리케이션으로 식별하면, 서버는 이를 인식하고 화면의 중앙에 위치한 넓은 영역을 해당 창에 할당할 수 있습니다. 반면, 자신을 시계로 식별하는 애플리케이션은 화면 가장자리의 더 작은 영역으로 배정될 수 있습니다.
기본적으로 Qt 애플리케이션은 시스템 PID(“프로세스 ID”) 를 IVI-id로 공개합니다. 클라이언트는 서버에 연결하기 전에 환경 변수 ` QT_IVI_SURFACE_ID `를 설정하여 이 설정을 재정의할 수 있습니다.
예제
Qt Wayland Compositor 는 한 번에 여러 셸 확장을 지원할 수 있지만, IVICompositor 예제는 IviApplication 프로토콜만 지원합니다. 즉, 클라이언트가 서버에 연결하려면 이 셸 확장을 지원해야 합니다.
예제의 컴포지터 창은 가로로 두 부분으로 나뉘어 있습니다. 왼쪽 영역은 ID가 "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 `을 생성하고, 이를 기반으로 모든 컴포지터 콘텐츠의 최상위 컨테이너로 ` Window `를 생성합니다. 이 창 내부에는 애플리케이션이 연결될 때 이를 담을 컨테이너 역할을 할 두 개의 사각형을 생성합니다.
클라이언트 연결
별도의 구성이 이루어지지 않은 경우, 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 코드로 쉽게 추가할 수 있습니다.
© 2026 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.