Может ли программа Qt5, работающая на X, отключить свернуть и закрыть?
Я пишу приложение C++ Qt5, которое работает на X. Менеджер окон, под которым он будет работать, - Metacity. У меня есть несколько требований, я не знаю, как решить:
- Окно не должно быть закрыто
- Окно не должно быть свернуто
- Окно всегда должно быть сверху
Я вроде как реализовал требование 3, используя:
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
Однако, если щелкнуть правой кнопкой мыши заголовок окна, все равно появится всплывающее меню:
В этом меню пользователь может отключить параметр "Всегда сверху", а параметры "Свернуть" и "Закрыть" по-прежнему доступны. Я пытался:
setWindowFlags(windowFlags() & ~(Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint));
но эта функция, кажется, не делает то, что я хочу с этим оконным менеджером, потому что никакие функции не отключаются.
Одна резервная позиция:
- Перезапустите приложение, если оно когда-либо было закрыто (это уже установлено по другим причинам).
- Восстановите окно к его нормальному размеру, если оно когда-либо было свернуто
Еще одна запасная позиция:
- использование
Qt::X11BypassWindowManagerHint
который полностью избегает оконного менеджера и реализует перемещение и изменение размеров окна самостоятельно.
В идеале я хотел бы продолжать использовать диспетчер окон, чтобы предлагать функциональность перемещения и размера окна, но отключать ненужные мне функции.
(Пожалуйста, постарайтесь избегать комментариев типа "ну, вы не должны этого делать" или "это глупая идея" - да, я знаю, но это приложение не для общего использования, оно используется только в специализированной среде и является предметом обсуждения). к требованиям, не написанным мной.)
1 ответ
Простой ответ на ваш первоначальный вопрос - да.
От твоего вопроса я не уверен во всех комбинациях, которые ты пробовал, и что не работает для каждой. Не ясно, работает ли какой-либо из QtWindowsFlags, кроме Qt::WindowStaysOnTopHint, для вас.
В следующем примере оконных флагов виджетов Qt5 есть что-то, что вы можете использовать для проверки поведения различных WindowFlags.
Между использованием оконных флагов WindowRole вы должны иметь возможность установить _NET_WM_ALLOWED_ACTIONS и _NET_WM_WINDOW_TYPE, используя Qt5 через XCB, и Metacity должна соблюдать его в соответствии с их файлом соответствия.
От изучения исходного кода до тех пор, пока вызывается recalc_window_features, строка заголовка, если таковая имеется, и меню правой кнопки мыши не должны закрываться или минимизироваться. Соответствующий исходный код для этого находится здесь, здесь, на стороне Qt5, и здесь. на стороне Metacity, на случай, если вам понадобится исправить, отследить или отладить дальше.
Как предложил Scheff, одним из способов решения вашей проблемы является установка FramelessWindowHint, однако я полагаю, что после проверки кода у вас будет больше удачи при установке флагов окна для запуска особого случая, расположенного здесь.
Например
Qt::WindowFlags flags = windowFlags();
flags |= Qt::CustomizeWindowHint;
flags |= Qt::WindowTitleHint;
flags |= Qt::WindowStaysOnTopHint;
flags &= ~Qt::WindowMinimizeButtonHint;
flags &= ~Qt::WindowMaximizeButtonHint;
flags &= ~Qt::WindowCloseButtonHint;
Пример кода выше не проверен.
Я полагаю, что вам не хватало CustomizeWindowHint
без этого флаги устанавливаются в значения по умолчанию, если тип окна QWindow, как здесь.
Еще один вопрос Stackru, который может быть связан с этим, - это то, что полноэкранный режим для QDialog из MainWindow работает только иногда, но это больше касается того, чтобы QDialog вел себя как QWindow, чтобы обойти ошибку Metacity.