如何控制从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中有一个Window
的screen
属性。 你可以为它分配一个Qt.application.screens
数组的元素。
如果你想在第一个屏幕上显示一个窗口,你可以这样做:
import QtQuick.Window 2.3 // the 2.3 is necessary
Window {
//...
screen: Qt.application.screens[0]
}
将窗口分配给窗口似乎将其定位在屏幕的中心。 如果要精细控制窗口的位置,可以使用x
和y
而不是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