Qt Make 应用程序在 Weston/Wayland 平台上始终位于最前面
Qt Make Application Always on Top on Weston/Wayland Platform
我想在 wayland-weston 桌面系统中安排两个应用程序的焦点。两个应用程序是:
- 写在Qt/QML,全屏
- 使用 Wayland 客户端编写 API + OpenGL,全屏
我想让 App#1 始终位于顶部,而 App#2 始终位于底部,即使我杀死并重生其中任何一个。我也想这样做,因为它们都是全屏应用程序。
我已经调查并找到了一些实现此目的的方法:
在桌面系统中使用wmctrl
排列windows:我已经试过了。但是,我得到 Cannot open display.
。后来我发现 wmctrl
不适用于 Weston/XWayland,仅适用于 X11。所以,我认为这不再是一个选择。
默认情况下让 App#1 (Qt/QML) 总是在最前面:为了解决这个问题,我尝试在 [=61] 中添加了以下内容=]:
ApplicationWindow {
visible: true
visibility: "FullScreen"
width: 1920
height: 720
flags: Qt.WindowStaysOnTopHint|Qt.FramelessWindowHint
MainScreen{
anchors.fill: parent
}
}
使 App#2(Wayland 客户端 API/OpenGL)默认始终位于底部。老实说,我对 Wayland Client API 不是很熟悉,但我可以在一些指导下探索它,如果这样的事情是可能的话。
现在,我的重点是让 Qt 应用程序始终位于最前面。它适用于我的 PC,但不适用于目标平台。我的电脑是 Ubuntu 16.04,带有 Xorg。目标平台有 weston 合成器和 xwayland 后端。我不知道为什么它在目标中不起作用。它可能是桌面系统。任何指导和想法表示赞赏。谢谢
编辑: 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 上的 Qt 5.10.1,目标平台上的 Qt 5.8.0
您应该在主 C++ 文件中设置标志
编辑
这适用于 Qt/C++ 应用程序:
setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
showFullScreen();
您可以按照此处的指南进行操作:
对于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;
}
}
我已经打开了一个关于 Qt Bugs 的问题,并从 Qt 员工那里了解到,由于 Weston 合成器的限制,这是不可能的。所以,我要么创建自己的合成器,要么使用不同的合成器。
我想在 wayland-weston 桌面系统中安排两个应用程序的焦点。两个应用程序是:
- 写在Qt/QML,全屏
- 使用 Wayland 客户端编写 API + OpenGL,全屏
我想让 App#1 始终位于顶部,而 App#2 始终位于底部,即使我杀死并重生其中任何一个。我也想这样做,因为它们都是全屏应用程序。
我已经调查并找到了一些实现此目的的方法:
在桌面系统中使用
wmctrl
排列windows:我已经试过了。但是,我得到Cannot open display.
。后来我发现wmctrl
不适用于 Weston/XWayland,仅适用于 X11。所以,我认为这不再是一个选择。默认情况下让 App#1 (Qt/QML) 总是在最前面:为了解决这个问题,我尝试在 [=61] 中添加了以下内容=]:
ApplicationWindow { visible: true visibility: "FullScreen" width: 1920 height: 720 flags: Qt.WindowStaysOnTopHint|Qt.FramelessWindowHint MainScreen{ anchors.fill: parent } }
使 App#2(Wayland 客户端 API/OpenGL)默认始终位于底部。老实说,我对 Wayland Client API 不是很熟悉,但我可以在一些指导下探索它,如果这样的事情是可能的话。
现在,我的重点是让 Qt 应用程序始终位于最前面。它适用于我的 PC,但不适用于目标平台。我的电脑是 Ubuntu 16.04,带有 Xorg。目标平台有 weston 合成器和 xwayland 后端。我不知道为什么它在目标中不起作用。它可能是桌面系统。任何指导和想法表示赞赏。谢谢
编辑: 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 上的 Qt 5.10.1,目标平台上的 Qt 5.8.0
您应该在主 C++ 文件中设置标志
编辑
这适用于 Qt/C++ 应用程序:
setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
showFullScreen();
您可以按照此处的指南进行操作:
对于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;
}
}
我已经打开了一个关于 Qt Bugs 的问题,并从 Qt 员工那里了解到,由于 Weston 合成器的限制,这是不可能的。所以,我要么创建自己的合成器,要么使用不同的合成器。