WindowManager QML类型

窗口模型和控制器。 更多...

导入语句import QtApplicationManager.SystemUI 2.0

属性

信号

方法

详细描述

WindowManager单例类型是应用程序管理器中的窗口管理部分。它仅提供QML API。

该类型从QAbstractListModel派生,可以直接作为窗口视图中使用的模型。

此模型中的每个项对应一个实际窗口表面。请注意,单个应用程序可以拥有多个表面;因此,在此模型中,applicationId角色不是唯一的。

此模型中提供了以下角色

角色名称类型描述
applicationIdstring以字符串表示的应用程序的唯一ID。这可以用于在ApplicationManager模型中查找有关应用程序的信息。
window WindowObject包含客户端表面的WindowObject。要显示它,您必须将其放入WindowItem
contentState WindowObject::ContentState《windowmanager-contentstate`

注意:请知晓Wayland本质上是一个异步IPC协议,因此在进行状态变化时,客户端和服务器进程的速度会有所不同。一个主要的例证是在客户端窗口属性的变化:除了服务器端异步更改外,当窗口对象没有通过windowAdded信号在服务器端引起时,windowPropertyChanged信号将不会发出。然而,所有的这些更改都不会丢失,但是在发出windowAdded信号之前的最后更改将是系统UI侧窗口对象的初始状态。

导入后,可以根据以下示例使用WindowManager单例。它演示了如何实现一个支持窗口开启和关闭动画的基本、全屏窗口合成器。

import QtQuick 2.10
import QtApplicationManager.SystemUI 2.0

// Simple solution for a full-screen setup
Item {
    width: 1024
    height: 640

    Connections {
        target: WindowManager
        // Send windows to a separate model so that we have control
        // over removals and ordering
        function onWindowAdded(window) {
            windowsModel.append({"window":window});
        }
    }

    Repeater {
        model: ListModel { id: windowsModel }
        delegate: WindowItem {
            id: windowItem
            anchors.fill: parent
            z: model.index

            window: model.window

            states: [
                State {
                    name: "open"
                    when: model.window.contentState === WindowObject.SurfaceWithContent
                    PropertyChanges { target: windowItem; scale: 1; visible: true }
                }
            ]

            scale: 0.50
            visible: false

            transitions: [
                Transition {
                    to: "open"
                    NumberAnimation {
                        target: windowItem; property: "scale"
                        duration: 500; easing.type: Easing.OutQuad
                    }
                },
                Transition {
                    from: "open"
                    SequentialAnimation {
                        // we wanna see the window during the closing animation
                        PropertyAction { target: windowItem; property: "visible"; value: true }
                        NumberAnimation {
                            target: windowItem; property: "scale"
                            duration: 500; easing.type: Easing.InQuad
                        }
                        ScriptAction { script: {
                            // It's important to destroy our WindowItem once it's no longer needed in
                            // order to free up resources
                            if (model.window.contentState === WindowObject.NoSurface)
                                windowsModel.remove(model.index, 1);
                        } }
                    }
                }
            ]
        }
    }
}

属性文档

[只读] count : int

此属性保存可用应用程序的数量。


[只读] runningOnDesktop : bool

如果运行在经典桌面窗口管理器(Windows、X11或macOS)上,则为true,否则为false


slowAnimations : bool

动画是否在慢速模式下。

默认为false,可能通过命令行选项--slow-animations初始化为true。

在需要调整慢速动画模式的定时器时也很有用。


信号文档

raiseApplicationWindow(string applicationId)

当通过ApplicationManager启动已运行的由applicationId标识的应用程序时,将发出此信号。

注意:相应处理器是onRaiseApplicationWindow


windowAboutToBeRemoved(WindowObject window)

在将从窗口移除到模型之前发出此信号。例如,当在应用程序一边将窗口的visible属性设置为false时,就会发生这种情况。

注意:相应处理器是onWindowAboutToBeRemoved


windowAdded(WindowObject window)

当向模型添加新的WindowObject时,将发出此信号。这通常会在应用程序启动期间发生,当一个应用程序创建一个新的窗口表面时。

要在您的QML场景中显示该窗口,您需要将其分配给一个WindowItem

注意:请知晓当客户端设置窗口为可见时,不会立即发出windowAdded信号。这是由于底层Wayland协议的异步性所致。

注意:相应处理器是onWindowAdded


windowContentStateChanged(WindowObject window)

当指定窗口的 WindowObject::contentState 改变时,会发出此信号。

注意:相应的处理程序是 onWindowContentStateChanged

另请参阅:WindowObject::contentState


windowPropertyChanged(WindowObject window, string name, var value)

报告应用窗口的属性变更,其中属性通过 name 标识并修改为 value

注意:当监听 Wayland 客户端的属性变更时,注意底层 Wayland 协议的 异步特性

注意:相应的处理程序是 onWindowPropertyChanged

另请参阅:ApplicationManagerWindow::setWindowProperty()


方法说明

object addExtension(Component component)

component 创建一个 Wayland 合成器扩展,并将其添加到 System UI 的底层 WaylandCompositor。组件必须是有效的 Wayland 合成器扩展。如果成功,在多进程模式下,函数返回创建的扩展。一旦 ApplicationManager::windowManagerCompositorReady 为真,扩展就可以添加,例如

import QtWayland.Compositor.TextureSharingExtension 1.0

Component {
    id: texshare
    TextureSharingExtension {}
}

Connections {
    target: ApplicationManager
    function onWindowManagerCompositorReadyChanged() {
        WindowManager.addExtension(texshare);
    }
}

另请参阅:ApplicationManager::windowManagerCompositorReady


object get(int index)

以 JavaScript 对象的形式检索 index 的模型数据。请参阅 角色名称 了解预期对象字段。

如果指定的 index 无效,则返回空对象。


int indexOfWindow(WindowObject window)

返回窗口在 WindowManager 模型中的索引,如果不是受管理的窗口项,则返回 -1


bool makeScreenshot(string filename, string selector)

根据 selector 的内容创建一个或多个截图,并将其保存到由 filename 指定的文件中。

filename 参数可以是单个截图的普通文件名,也可以包含要替换的格式序列,如果请求多个截图,则将相应地替换这些序列

格式描述
%s将被替换为特定截图的屏幕 ID。
%i在制作应用程序窗口的截图时,将被替换为应用程序 ID。
%%将被替换为一个单独的反斜杠 % 字符。

selector 参数是一个字符串,其解析方式如下

<application-id>[window-property=value]:<screen-id>

所有部分都是可选的,因此如果指定一个空字符串,调用将会为每个屏幕创建截图。如果指定了一个 application-id(也可以包含匹配多个应用的通配符),将会为这个(这些)应用中的每个窗口创建截图。如果只应该使用一个或多个应用的特定窗口来创建截图,你可以指定一个 window-property 选择器,这将只选择具有匹配 WindowManager::windowProperty 的窗口。添加一个 screen-id 会使截图的创建仅限于指定的屏幕。

以下是一个示例,创建第二屏幕上具有窗口属性 type 设置为 cluster 且由 Pelagicore 编写的所有窗口的截图。

com.pelagicore.*[type=cluster]:1

成功时返回 true,否则返回 false

注意:此调用将是异步处理的,所以即使返回值是积极的,也不意味着所有的截图图像都已经创建好了。


WindowObject window(int index)

返回对应给定的 index 的模型中的 window 或者在索引无效时返回 null

注意:返回的 Window 对象的所有权属于应用管理器。如果你想要存储此指针,可以使用WindowManagerQAbstractListModel信号或windowAboutToBeRemoved信号来通知你,如果对象即将在 C++ 端被删除。


list<WindowObject> windowsOfApplication(string applicationId)

返回属于给定 applicationId 的模型中的windows列表,如果应用id无效则返回空列表。

注意:返回的 Window 对象的所有权属于应用管理器。如果你想要存储这些指针,可以使用WindowManagerQAbstractListModel信号或windowAboutToBeRemoved信号来通知你,如果对象即将在 C++ 端被删除。


©2019 Luxoft Sweden AB。本文件中包含的文档贡献为其各自所有者的版权。本提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款许可。Qt及其相关标志是芬兰和/或其他国家及地区的Qt公司有限责任公司的商标。所有其他商标均为其各自所有者的财产。