如何控制从QML显示窗口的屏幕

我的应用程序有一个带有按钮的主窗口,当我单击按钮时,我使用createComponent创建Window {}的子类并显示它(纯粹用QML)。 我使用另一台显示器连接了我的Macbook上的应用程序。

如果我不试图设置新窗口的.x.y属性,那么它会显示在我的主窗口的顶部,无论主窗口是在我的macbook屏幕还是在所连接的显示器上(即新窗口是始终显示在与主窗口相同的屏幕上)。 但是,如果我确实设置了新窗口的.x.y属性(任何值),则新窗口始终显示在macbook屏幕上,而不管我在哪个屏幕上显示主窗口。

我怎样才能控制我的新窗口显示在哪个可用的屏幕上? 相关的,我怎样才能精确地控制屏幕上新窗口的位置(例如,我怎样才能让新窗口始终出现在右下角)?

编辑:基本代码。 RemoteWindow.qml

Window {
    id: myWindow
    flags: Qt.Window | Qt.WindowTitleHint | Qt.WindowStaysOnTopHint 
        | Qt.WindowCloseButtonHint
    modality: Qt.NonModal
    height: 500
    width: 350

    // window contents, doesn't matter
}

在我的主窗口中,我有这个函数( remoteControl是一个保持对远程窗口的引用的属性):

function showRemoteWindow() {
    remoteControl.x = Screen.width - remoteControl.width
    remoteControl.y = Screen.height - remoteControl.height
    remoteControl.show()
}

同样在我的主窗口中,我有一个按钮,并在其onClicked:事件中我有这样的代码:

if (remoteControl) {
    showRemoteWindow()
} else {
    var component = Qt.createComponent("RemoteWindow.qml")
    if (component.status === Component.Ready) {
        remoteControl = component.createObject(parent)
        showRemoteWindow() // window appears even without this call,
            // but calling this method to also set the initial position
    }
}

如果我在showRemoteWindow函数中注释掉.x.y的设置,那么我的RemoteWindow将始终与我的主窗口(macbook屏幕或附加显示器)出现在相同的屏幕中。 但是,如果我将这两行取消注释(或者尝试设置窗口的x或y位置),则无论我的主窗口位于哪个屏幕,我的RemoteWindow都会出现在macbook屏幕上。


就像@Blabdouze所说,现在在Qt 5.9中有一个Windowscreen属性。 你可以为它分配一个Qt.application.screens数组的元素。

如果你想在第一个屏幕上显示一个窗口,你可以这样做:

import QtQuick.Window 2.3 // the 2.3 is necessary

Window {
    //...
    screen: Qt.application.screens[0]
}

将窗口分配给窗口似乎将其定位在屏幕的中心。 如果要精细控制窗口的位置,可以使用xy而不是screen 。 例如,如果您想在第一个屏幕的左下角显示一个窗口:

Window {
    //...
    screen: Qt.application.screens[0] //assigning the window to the screen is not needed, but it makes the x and y binding more readable
    x: screen.virtualX
    y: screen.virtualY + screen.height - height
}

如果你还没有使用Qt 5.9,你可以像这样从c ++中暴露屏幕数组:

QList<QObject*> screens;
for (QScreen* screen : QGuiApplication::screens())
    screens.append(screen);
engine.rootContext()->setContextProperty("screens", QVariant::fromValue(screens));

使用geometry / virtualGeometry而不是virtualX / virtualY访问屏幕的geometry

x: screens[0].geometry.x
链接地址: http://www.djcxy.com/p/96857.html

上一篇: How to control which Screen a Window is shown in from QML

下一篇: Implementing NGX Datatable Column filtering