窗口管理器 QML 类型

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

导入语句import QtApplicationManager.SystemUI 2.0

属性

信号

方法

详细描述

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

该类型继承自QAbstractListModel,可以直接在窗口视图中用作模型。

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

此模型中可用以下角色

角色名称类型描述
applicationIdstring表示为字符串的应用程序的唯一 ID。这可用于在 ApplicationManager 模型中查找有关应用程序的信息。
windowWindowObject 包含客户端界面的WindowObject。要显示它,您必须将其放入一个WindowItem
WindowObjectWindowObjectwindow完全相同。这是为了使PackageManager和WindowManager模型之间的角色名称尽可能相似。此角色是在Qt版本6.6中引入的。
contentStateWindowObject::ContentState WindowObject的内容状态。请参阅WindowObject::contentState

注意:请注意,Wayland本质上是一个异步IPC协议,会导致状态更改时客户端和服务器进程中有不同的本地状态。这的一个主要例子是客户端的窗口属性更改:除了在服务器端异步更改外,如果在尚未通过windowAdded信号在服务器端使窗口对象可用,则不会发射windowPropertyChanged信号。然而,所有这些更改都没有丢失,但在发射windowAdded信号之前的最后更改将是系统UI端窗口对象的初始状态。

导入之后,可以使用以下示例使用WindowManager单例。它演示了如何实现一个支持窗口显示和隐藏动画的基本、全屏窗口合成器

import QtQuick
import QtApplicationManager.SystemUI

// 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)

在从模型中删除window之前发射此信号。例如,当在应用程序侧将窗口的visible属性设置为false时,会发生这种情况。

注意:对应的处理程序是onWindowAboutToBeRemoved


windowAdded(WindowObject window)

当将新的WindowObject添加到模型时,将发射此信号。这发生在响应应用程序创建新的窗口表面时,通常在应用程序的启动过程中发生。

要将此window显示在您的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。该component必须持有一个有效的Wayland组合器扩展。在多进程模式下成功执行时,函数返回创建的扩展。扩展只能添加一次,例如在ApplicationManager::windowManagerCompositorReady为真的情况下。

import QtWayland.Compositor.TextureSharingExtension

Component {
    id: texshare
    TextureSharingExtension {}
}

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

另请参阅:ApplicationManager::windowManagerCompositorReady


object get(int index)

检索索引为index的模型数据作为一个JavaScript对象。有关期望的对象字段,请参阅角色名称

如果指定的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>

所有部分都是可选的,因此如果您指定一个空字符串,将创建每个屏幕的截图。如果您指定了一个应用程序-id(这也可以包含匹配多个应用程序的通配符),将为该(这些)应用程序的每个窗口制作截图。如果只使用一个或多个应用程序的特定窗口来创建截图,您可以指定一个窗口属性选择器,它将只选择具有匹配的WindowManager::windowProperty的窗口。添加一个屏幕-id将限制截屏的创建到指定的屏幕。

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

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

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

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


窗口对象 window(int index)

返回与模型中给定的index对应的窗口,如果索引无效则返回null

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


列表<窗口对象> windowsOfApplication(字符串 applicationId)

返回属于模型中给定applicationId窗口列表,如果applicationId无效则返回空列表。

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


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