IVI合并器

IVI合并器是演示如何使用 IviApplication 扩展的示例。

简介

此示例演示了在Wayland显示服务器(也称为Wayland合并器)中使用 IviApplication 框架扩展。

有关使用Qt创建Qt Wayland合并器的基本原理的介绍,请参阅最小QML示例

协议

IviApplication 是一个专门为制造车载信息娱乐系统而设计的 框架扩展

它是一个简约协议,仅提供以下功能

  1. 客户端可以使用 IVI-id 来标识自己。
  2. 服务器可以请求客户端调整其大小。
标识号码

在一个典型的 IviApplication 配置中,您将有一组预定义的应用程序可以连接到服务器。因为当系统设计时就已知道这些应用程序,所以可以为它们分配硬编码的数字来标识它们。由于客户端和服务器事先同意这些数字,因此可以将语义构建到ID号码中。

例如,如果一个客户端将自己识别为导航应用程序,则服务器可以识别这一点,并为它的窗口分配屏幕上一个大且居中的部分。另一方面,将自己识别为时钟的应用程序可能会被分配到屏幕边缘的较小区域。

默认情况下,Qt应用程序将使用它们的系统PID(“进程ID”)作为 IVI-id 广告。客户端可以通过在连接到服务器之前在其环境中设置 QT_IVI_SURFACE_ID 来覆盖此值。

示例

Qt Wayland合并器可以同时支持多个框架扩展,但 IVICompositor 示例 仅支持 IviApplication 协议。这意味着客户端也必须支持此框架扩展才能连接到服务器。

示例中的合并器窗口水平拆分为两部分:左侧区域指定用于具有id "1337"的专业应用程序,右侧区域用于所有其他应用程序。

创建布局

窗口布局是在 WaylandOutput 中创建的。这通常对应于用于合并器的物理屏幕。如果一个 WaylandOutput 被创建,如在 IVICompositor 示例 中,它通常对应于主屏幕。

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信号接收一个IviSurface参数,可用于访问客户端ID。合成器随后为表面创建一个ShellSurfaceItem(由chromeComponent定义)。ShellSurfaceItem是用于将shell表面放置到Qt Quick场景中的类,你将在所有Qt Wayland Compositor示例中看到相同的模式。

IVICompositor示例的特别之处在于它会检查传入的shell表面的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代码添加。

示例项目 @ code.qt.io

© 2024Qt公司有限公司。此处包含的文档贡献是其所有者的版权。提供的文档遵循由自由软件基金会发布的GNU自由文档许可证版本1.3的条款。Qt及相关商标是芬兰及其它国家或地区的Qt公司有限公司的商标。所有其他商标均为其各自所有者的财产。