1

我想在 Wayland-weston 桌面系统中安排两个应用程序的焦点。两个应用是:

  1. 用 Qt/QML 编写,全屏
  2. 使用 Wayland Client API + OpenGL 编写,全屏

我想让 App#1 始终位于顶部,而 App#2 始终位于底部,即使我杀死并重生了它们中的任何一个。当它们都是全屏应用程序时,我也想这样做。

我已经调查并发现了几种实现这一目标的方法:

  1. 用于在桌面wmctrl系统中排列窗口:我已经尝试过了。但是,我得到Cannot open display.. 后来我发现它wmctrl不适用于 Weston/XWayland,仅适用于 X11。所以,我认为这不再是一个选择。

  2. 默认情况下,使 App#1 (Qt/QML) 始终位于顶部:为了解决这个问题,我尝试在 main.qml 中添加以下内容:

    ApplicationWindow {
        visible: true
        visibility: "FullScreen"
        width: 1920
        height: 720
        flags: Qt.WindowStaysOnTopHint|Qt.FramelessWindowHint
    
        MainScreen{
            anchors.fill: parent
        }
    }
    
  3. 默认情况下,使 App#2(Wayland Client API/OpenGL)始终位于底部。老实说,我对 Wayland Client 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
    }

}

编辑: PC 上的 Qt 版本 Qt 5.10.1,目标平台上的 Qt 5.8.0

4

2 回答 2

1

我在 Qt Bugs 上打开了一个问题,并从 Qt 员工那里了解到,由于 Weston compositor 的限制,这是不可能的。所以,我要么创建自己的合成器,要么使用不同的合成器。

于 2019-02-09T13:06:44.647 回答
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;
   }
}    
于 2019-02-01T07:16:22.163 回答