代码之家  ›  专栏  ›  技术社区  ›  mozcelikors

Qt使应用程序始终位于Weston/Wayland平台的顶部

  •  0
  • mozcelikors  · 技术社区  · 5 年前

    我想在Wayland Weston桌面系统中安排两个应用程序的焦点。有两种应用程序:

    1. 以qt/qml格式编写,全屏
    2. 使用Wayland客户端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. 默认情况下,使应用程序2(Wayland客户端API/OpenGL)始终位于底部。老实说,我对Wayland客户机API不太熟悉,但是如果可能的话,我可以在一些指导下进行探索。

    现在,我的重点是让qt应用程序始终处于顶层。它在我的电脑上工作,但在目标平台上不工作。我的电脑是Ubuntu 16.04,带有xorg。目标平台具有带有Xwayland后端的Weston合成器。我不知道为什么它在目标中不起作用。可能是桌面系统。任何指导和想法都会受到赞赏。谢谢

    编辑: 主CPP

        QGuiApplication app(argc, argv);
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
        return app.exec();
    

    编辑 MQ.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 回复  |  直到 5 年前
        1
  •  1
  •   mozcelikors    5 年前

    我打开了一个关于qt bug的问题,从一个qt员工那里了解到,这是不可能的,因为韦斯顿合成器的限制。所以,我要么创建自己的排字器,要么使用不同的排字器。

        2
  •  0
  •   madduci    5 年前

    应该在主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;
       }
    }    
    
    推荐文章