Qt Make Application всегда впереди на платформе Weston/Wayland

Я хотел бы организовать фокусирование двух приложений в настольной системе Wayland-Weston. Два приложения:

  1. Написано в Qt/QML, полноэкранный
  2. Написано с Wayland Client API + OpenGL, полноэкранный

Я бы хотел, чтобы приложение № 1 всегда было сверху, а приложение № 2 всегда снизу, даже если я убью и возродю любое из них. Я также хотел бы сделать это, в то время как они оба полноэкранные приложения.

Я исследовал и нашел несколько способов добиться этого:

  1. С помощью wmctrl организовать окна в настольной системе: я пробовал это. Тем не менее, я получаю Cannot open display., Позже я узнал, что wmctrl не работает с Weston/XWayland, работает только с X11. Так что я не думаю, что это вариант больше.

  2. По умолчанию приложение № 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 Client API/OpenGL) всегда по умолчанию снизу. Честно говоря, я не очень знаком с Wayland Client API, но я мог бы изучить его под руководством, если что-то подобное возможно.

Сейчас я сосредоточен на том, чтобы приложение Qt всегда было на высоте. Он работает на моем ПК, но не работает на целевой платформе. Мой компьютер - 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 Version Qt 5.10.1 на ПК, Qt 5.8.0 на целевой платформе

2 ответа

Решение

Я открыл вопрос об ошибках Qt и узнал от сотрудника Qt, что это невозможно из-за ограничений со стороны композитора Weston. Поэтому я либо создам свой собственный композитор, либо использую другой.

Вы должны установить флаги в вашем главном файле C++

РЕДАКТИРОВАТЬ

Это для приложений Qt/C++:

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

Вы можете следовать руководству здесь:

Флаги Windows

Для 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;
   }
}    
Другие вопросы по тегам