【发布时间】:2019-02-01 07:11:36
【问题描述】:
我想在 wayland-weston 桌面系统中安排两个应用程序的焦点。两个应用程序是:
- 用 Qt/QML 编写,全屏
- 使用 Wayland 客户端 API + OpenGL 编写,全屏
我希望 App#1 始终位于顶部,而 App#2 始终位于底部,即使我杀死并重生了它们中的任何一个。我也想在它们都是全屏应用时这样做。
我已经调查并发现了几种实现此目的的方法:
使用
wmctrl在桌面系统中排列窗口:我已经尝试过了。但是,我得到Cannot open display.。后来我发现wmctrl不适用于 Weston/XWayland,仅适用于 X11。所以,我认为这不再是一个选择。-
默认情况下使 App#1 (Qt/QML) 始终位于顶部:我尝试解决此问题的是我在 main.qml 中添加了以下内容:
ApplicationWindow { visible: true visibility: "FullScreen" width: 1920 height: 720 flags: Qt.WindowStaysOnTopHint|Qt.FramelessWindowHint MainScreen{ anchors.fill: parent } } 让 App#2(Wayland 客户端 API/OpenGL)默认始终位于底部。老实说,我对 Wayland 客户端 API 不太熟悉,但如果有可能的话,我可以在一些指导下探索它。
现在,我的重点是让 Qt 应用程序始终处于领先地位。它适用于我的 PC,但不适用于目标平台。我的电脑是 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上的Qt 5.10.1,目标平台上的Qt 5.8.0
【问题讨论】:
-
你必须设置事件onActiveChanged(见我的回复)
-
@madduci 我已经尝试过了。不幸的是,它不起作用。
标签: linux qt qml wayland wmctrl