Qt使应用程序始终在Weston / Wayland平台上排名第一

时间:2019-02-01 07:11:37

标签: linux qt qml wayland wmctrl

我想在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上运行,但不能在目标平台上运行。我的电脑是带有Xorg的Ubuntu 16.04。目标平台具有带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

2 个答案:

答案 0 :(得分:1)

我已经打开了有关Qt Bug的问题,并从Qt员工那里得知,由于Weston合成器的限制,这是不可能的。因此,我要么创建自己的合成器,要么使用其他合成器。

答案 1 :(得分:0)

您应该在主C ++文件中设置标志

编辑

这是针对 Qt / C ++ 应用的:

setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
showFullScreen();

您可以在此处遵循指南:

Windows Flags

对于 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;
   }
}