我想在一个wayland-weston桌面系统中安排两个应用程序的焦点。两个应用程序是:
- 用Qt/QML编写,全屏
- 使用Wayland Client API+OpenGL编写,全屏
我想让应用程序#1始终在顶部,应用程序#2始终在底部,即使我杀死并重生了它们中的任何一个。当它们都是全屏应用程序时,我也想这样做。
我已经调查并发现了几种实现这一点的方法:
-
使用
wmctrl
在桌面系统中排列窗口:我已经尝试过了。然而,我得到了Cannot open display.
。后来我发现wmctrl
不适用于Weston/XWayland,只适用于X11。所以,我认为这不再是一个选择。 -
默认情况下,让应用程序#1(Qt/QML)始终处于顶部:为了解决这个问题,我在我的main.QML:中添加了以下内容
ApplicationWindow { visible: true visibility: "FullScreen" width: 1920 height: 720 flags: Qt.WindowStaysOnTopHint|Qt.FramelessWindowHint MainScreen{ anchors.fill: parent } }
-
默认情况下,使应用程序#2(Wayland Client API/OpenGL)始终位于底部。老实说,我对Wayland Client API不太熟悉,但如果有可能的话,我可以在一些指导下探索它。
现在,我的重点是让Qt应用程序始终处于领先地位。它在我的电脑上工作,但在目标平台上不工作。我的电脑是Ubuntu 16.04,带有Xorg。目标平台具有带有xwayland后端的weston合成器。我不知道为什么它对目标不起作用。也许是桌面系统。欢迎提供任何指导和想法。感谢
编辑:main.cpp
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
编辑main.qml
import QtQuick 2.0
import QtQuick.Controls 2.0
import QtQuick.Window 2.2
import "app/main"
ApplicationWindow {
visible: true
visibility: "FullScreen"
maximumWidth: 1920
maximumHeight: 720
minimumWidth: 1920
minimumHeight: 720
width: 1920
height: 720
title: qsTr("App")
flags: Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint
MainScreen{
anchors.fill: parent
}
}
编辑:Qt版本PC上的问题5.10.1,目标平台上的问题5.8.0
我打开了一个关于Qt Bugs的问题,并从一名Qt员工那里了解到,由于Weston compositor的限制,这是不可能的。所以,我要么创建自己的合成器,要么使用不同的合成器。
您应该在主C++文件中设置标志
编辑
这适用于Qt/C++应用程序:
setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
showFullScreen();
你可以按照这里的指南:
Windows标志
对于QML,您可以在.QML文件中使用:
import QtQuick.Window 2.2 // Window.FullScreen
import QtQuick.Controls 1.3 // ApplicationWindow
ApplicationWindow
{
id: window
onActiveChanged: {
window.visibility = activeFocusItem ? Window.FullScreen : Window.Minimized;
}
}