Может ли программа Qt5, работающая на X, отключить свернуть и закрыть?

Я пишу приложение C++ Qt5, которое работает на X. Менеджер окон, под которым он будет работать, - Metacity. У меня есть несколько требований, я не знаю, как решить:

  1. Окно не должно быть закрыто
  2. Окно не должно быть свернуто
  3. Окно всегда должно быть сверху

Я вроде как реализовал требование 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.

Другие вопросы по тегам