2009-08-05 6 views
5

Existe-t-il un moyen de créer une fenêtre (par exemple QDialog) sans icône de fenêtre dans le coin supérieur gauche? J'ai essayé d'utiliser une icône transparente mais elle laisse un espace vide là.Boîte de dialogue Qt sans icône de fenêtre (menu système)

Editer: La solution de richardwb ci-dessous supprime le menu système, mais supprime aussi Minimize/Maximize/Close (boutons de légende). Cela pourrait faire pour l'instant, mais heureusement, il existe une solution qui préserve les boutons de légendes.

+0

Quel système d'exploitation? Ce sera sûrement spécifique à la plate-forme (si possible du tout). – rohanpm

+0

Oh, désolé. Pour Windows, mais nous espérons qu'une solution multiplateforme existe. – swongu

Répondre

10

Si vous ne avez pas besoin de boutons de légende du tout, vous pouvez y parvenir en définissant un certain window flag hints:

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

l'application de démonstration de Qt a un exemple d'application qui vous permet d'expérimenter avec ces drapeaux (Qt Demo -> Widgets-> Window Flags) si vous voulez voir ce que font les différentes combinaisons.


D'autre part, si vous voulez un des cacher/boutons/Fermer, vous remarquerez oblige Qt le menu système et icône de la fenêtre pour apparaître. Je pense que c'est Qt généraliser les plates-formes un peu, car il est très facile de trouver des exemples de dialogues Windows natifs avec un bouton Fermer mais sans le menu système et l'icône de la fenêtre.

Dans ce cas, vous aurez besoin d'un code spécifique de Windows, semblable à celui (non testé):

#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 

Edit: Comme commenté par swongu, cela ne fonctionne que si vous voulez avoir un bouton de fermeture sans menu du système. Si vous voulez un bouton minimiser/maximiser mais pas de menu système, vous n'avez pas de chance.

+0

Merci pour cette idée. Malheureusement, votre extrait de code Windows fonctionne comme le cas Qt - une fois que le menu système disparaît, les boutons de légende disparaissent également. MSDN indique que 'WS_MAXIMIZEBOX' et' WS_MINIMIZEBOX' nécessitent 'WS_SYSMENU' pour être déclenchés. – swongu

+0

Oui, ils le font. Vous pouvez vous en sortir avec un bouton de fermeture sur la légende, cependant. Je vais éclaircir ça. – richardwb

+0

Je veux juste le bouton de fermeture (pas de menu système, pas maximiser/minimiser), mais cela ne fonctionne pas pour moi. Le bouton de fermeture disparaît également. J'ai mis les indicateurs de la fenêtre Qt à Qt :: Dialog | Qt :: PersonnaliserWindowHint | Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint. –