2009-08-05 4 views
5

Gibt es eine Möglichkeit, ein Fenster zu erstellen (z. B. QDialog), ohne ein Fenstersymbol in der oberen linken Ecke? Ich habe versucht, ein transparentes Symbol zu verwenden, aber es bleibt dort ein Leerzeichen.Qt-Dialog ohne Fenstersymbol (Systemmenü)

Bearbeiten: richardwb Lösung unten entfernt das Systemmenü, sondern entfernt auch Minimieren/Maximieren/Schließen (Beschriftung Schaltflächen). Dies könnte vorerst funktionieren, aber hoffentlich gibt es eine Lösung, die die Untertitel-Schaltflächen beibehält.

+0

Welches Betriebssystem? Es wird sicherlich plattformspezifisch (wenn überhaupt möglich) sein. – rohanpm

+0

Oh, Entschuldigung. Für Windows ist aber hoffentlich eine plattformübergreifende Lösung vorhanden. – swongu

Antwort

10

Wenn Sie keine Beschriftung Tasten überhaupt, dann können Sie dies erreichen, indem einige window flag hints:

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

Qt-Demo-Anwendung hat eine Beispielanwendung, die Sie mit diesen Flaggen experimentieren können (Qt Demo -> Widgets-> Window Flags) wenn Sie sehen möchten, was verschiedene Kombinationen tun.


Auf der anderen Seite, wenn Sie eine der/Schließen Tasten Minimieren/Maximieren wollen, werden Sie feststellen, zwingt Qt das Systemmenü und Fenstersymbol zu zeigen. Ich denke, das ist Qt verallgemeinern die Plattformen ein wenig, da es sehr einfach ist, Beispiele für native Windows-Dialoge mit a Close-Schaltfläche zu finden, aber ohne das Systemmenü und Fenstersymbol.

In diesem Fall müssen Sie einige Windows-spezifischen Code, ähnlich wie diese (ungetestet) benötigen:

#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: Wie swongu kommentierte dies funktioniert nur, wenn Sie ohne einen Schließen-Button haben wollen Systemmenü. Wenn Sie eine Schaltfläche zum Minimieren/Maximieren, aber kein Systemmenü möchten, haben Sie kein Glück.

+0

Danke für diese Idee. Leider funktioniert Ihr Windows-Code-Snippet wie der Qt-Fall - sobald das Systemmenü ausgeblendet wird, verschwinden auch die Beschriftungsschaltflächen. MSDN gibt an, dass "WS_MAXIMIZEBOX" und "WS_MINIMIZEBOX" erfordern, dass "WS_SYSMENU" ausgelöst wird. – swongu

+0

Ja, das tun sie. Sie können jedoch mit einem geschlossenen Knopf auf der Bildunterschrift davonkommen. Ich werde das klären. – richardwb

+0

Ich möchte nur die Schließen-Taste (kein Systemmenü, keine Maximierung/Minimierung), aber das funktioniert nicht für mich. Die Schließen-Schaltfläche wird ebenfalls ausgeblendet. Ich habe die Qt-Fensterflags auf Qt :: Dialog | gesetzt Qt :: AnpassenWindowHint | Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint. –