Qt Make Application всегда впереди на платформе Weston/Wayland
Я хотел бы организовать фокусирование двух приложений в настольной системе Wayland-Weston. Два приложения:
- Написано в Qt/QML, полноэкранный
- Написано с Wayland Client API + OpenGL, полноэкранный
Я бы хотел, чтобы приложение № 1 всегда было сверху, а приложение № 2 всегда снизу, даже если я убью и возродю любое из них. Я также хотел бы сделать это, в то время как они оба полноэкранные приложения.
Я исследовал и нашел несколько способов добиться этого:
С помощью
wmctrl
организовать окна в настольной системе: я пробовал это. Тем не менее, я получаюCannot open display.
, Позже я узнал, чтоwmctrl
не работает с Weston/XWayland, работает только с X11. Так что я не думаю, что это вариант больше.По умолчанию приложение № 1 (Qt/QML) всегда должно быть сверху. Я попытался решить эту проблему, добавив в свой main.qml следующее:
ApplicationWindow { visible: true visibility: "FullScreen" width: 1920 height: 720 flags: Qt.WindowStaysOnTopHint|Qt.FramelessWindowHint MainScreen{ anchors.fill: parent } }
Сделайте приложение №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();
Вы можете следовать руководству здесь:
Для 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;
}
}