Qt Make Application всегда впереди на платформе Weston / Wayland - PullRequest
0 голосов
/ 01 февраля 2019

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

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

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

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

  1. Использование wmctrl для организацииWindows в настольной системе: я пробовал это.Тем не менее, я получаю 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 Версия Qt 5.10.1 на ПК, Qt 5.8.0 на целевой платформе

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

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

0 голосов
/ 01 февраля 2019

Вы должны установить флаги в своем главном файле 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;
   }
}    
...