Диалог Qt без иконки окна (системное меню) - PullRequest
5 голосов
/ 06 августа 2009

Есть ли способ создать окно (например, QDialog) без значка окна в верхнем левом углу? Я пробовал использовать прозрачную иконку, но там оставалось пустое место.

Редактировать: Приведенное ниже решение Ричардваба удаляет системное меню, но также удаляет также Свернуть / Развернуть / Закрыть (кнопки с заголовками). Пока что это возможно, но, надеюсь, есть решение, которое сохраняет кнопки с титрами.

1 Ответ

10 голосов
/ 06 августа 2009

Если вам не нужны какие-либо кнопки с надписями, вы можете добиться этого, установив некоторые подсказки флагов окна :

setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint);

Демонстрационное приложение Qt имеет пример приложения, которое позволяет вам экспериментировать с этими флагами ( Qt Demo-> Widgets-> Флаги окна ), если вы хотите увидеть, что делают различные комбинации.


С другой стороны, если вам нужна любая из кнопок «Свернуть», «Развернуть» / «Закрыть», вы заметите, что Qt вызывает системное меню и значок окна. Я думаю, что это Qt, немного обобщающий платформы, поскольку очень легко найти примеры собственных диалогов Windows с кнопкой Закрыть, но без системного меню и значка окна.

В этом случае вам понадобится некоторый специальный код Windows, похожий на этот (непроверенный):

#if defined(Q_WS_WIN)
    // don't forget to #include <windows.h>
    HWND hwnd = winId();
    LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE);
    style &= ~WS_SYSMENU; // unset the system menu flag
    SetWindowLongPtr(hwnd, GWL_STYLE, style);
    // force Windows to refresh some cached window styles
    SetWindowPos(hwnd, 0, 0, 0, 0, 0, 
        SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
#endif

Редактировать: Как прокомментировал swongu, это работает, только если вы хотите иметь кнопку закрытия без системного меню. Если вам нужна кнопка минимизации / максимизации, но нет системного меню, вам не повезло.

...