2010-01-13 9 views
5

Ich habe ein schwebendes Werkzeugfenster. Es funktioniert gut unter Windows, aber ich kann nicht loswerden die Schaltfläche Maximieren auf Mac OS X. Ich habe versucht, Scharfschaltung Qt::WindowMaximizeButtonHint und das Fenster auf feste Größe. Nichts scheint zu funktionieren.So entfernen Sie die Schaltfläche "Maximieren" im Mac OS X-Werkzeugfenster in Qt

MyWidget::MyWidget(QWidget* parent) 
:QWidget(parent, Qt::Tool | Qt::CustomizeWindowHint) 
{ 
    setupUi(this); 

    setFixedSize(sizeHint()); // doesn't remove maximise button 
    setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint); // doesn't remove maximise button 
} 

Ich möchte kein rahmenloses Fenster verwenden. Irgendwelche Ideen? Ich benutze Qt 4.4.

Antwort

4

Dieser Code von Richard Gustavsen von Nokia arbeitet in Qt 4.4:

class MyWidget : public QWidget 
{ 
    public: 

    MyWidget::MyWidget(QWidget* parent) : QWidget(parent, Qt::Tool) 
    { 
    } 

    void setVisible(bool visible) 
    { 
     QWidget::setVisible(visible); 
     ChangeWindowAttributes(qt_mac_window_for(this), kWindowNoAttributes, kWindowFullZoomAttribute); 
    } 
}; 

Dank Richard und Nokia!

+0

Warum kann ich ChangeWindowAttributes nicht mit qt 4.8 64 bit build finden? – ldlchina

3

Sie könnten versuchen, die Fenster-Flags enthalten Qt::Dialog (fett hinzugefügt):

Zeigt an, dass das Widget ist ein Fenster, das als ein Dialog eingerichtet werden soll (dh typischerweise nicht maximieren oder minimieren, Tasten in die Titelleiste). Dies ist der Standardtyp für QDialog. Wenn Sie es als modalen Dialog verwenden möchten, sollte es von einem anderen Fenster aus gestartet werden oder über ein Elternelement verfügen und mit der Eigenschaft QWidget :: windowModality verwendet werden. Wenn Sie es modal machen, verhindert der Dialog, dass andere Top-Level-Fenster in der Anwendung Eingaben erhalten. Wir verweisen auf ein Fenster der obersten Ebene, das über ein übergeordnetes Fenster verfügt.

Ich weiß nicht, was passieren würde, wenn Sie beide Einstellung versucht Qt::Dialog und Qt::Tool, aber es könnte die Untersuchung wert sein.

+0

versuchten beide Qt :: Dialog | Qt :: Tool und Qt :: Dialog. Hatte immer noch eine Maximierung in beiden Fällen! –

9

Starten Sie Qt windowflags Beispielanwendung. Wählen Sie Tool Radio-Button und dann überprüfen:

  • Fenstertitel
  • Fenster Anpassen
  • Fenster schließen Schaltfläche

Es ist die einzige Art, wie ich auf Mac OS X gefunden zu erreichen, was Sie wollen, aber Sie wird den Minimierungsknopf loslassen. Es gibt keinen anderen Weg. Das ist die Mac OS X Window Manager-Einschränkung.

Zusammenfassend gibt es nur fünf Sätze von Schaltflächen in der Titelleiste:

  1. Alle Tasten sichtbar und alle Tasten aktiviert: setWindowFlags(Qt::Tool)
  2. Alle sichtbaren Tasten, in der Nähe und Tasten aktiviert maximieren, minimieren Taste deaktiviert: setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
  3. Alle Tasten sichtbar, maximieren Taste aktiviert, in der Nähe und minimieren Behinderte: setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowMaximizeButtonHint | Qt::CustomizeWindowHint)
  4. Nur ist schließen-Schaltfläche sichtbar und aktiviert setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
  5. Keine Knöpfe in der Titelleiste: setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
+0

Kamil, Große Antwort. Leider scheint Qt :: WindowCloseButtonHint in Qt 4.4 nicht verfügbar zu sein! –

+0

Entschuldigung dafür, aber ich benutze derzeit Qt 4.6, aber meine Absicht war es, Sie Windowflags Beispiel von Qt, so dass Sie einfach und ziemlich schnell die meisten Optionen ausprobieren könnten –

+0

Ich habe das Windowflags Beispiel in Qt 4.4 versucht, aber konnte nicht Finde keine Kombination, die den Maximierungs-Button entfernt hat. –

1

konnte ich es mit

setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint) 
2

Hier tut ein Cross-Plattform-Weg, es zu tun. Sie haben Ihre setVisible-Methode Ihres QMainWindow oder QWidget überschrieben. Genauso kann ein Fenster-Flag modifiziert werden, das visuelle Auswirkungen auf das Fenster hat.

Der Grund dafür ist, dass die Klasse Fensterspezifikationen haben muss, bevor das Fenster tatsächlich angezeigt wird.

void setVisible(bool visible) 
{ 
    setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint); 
    QWidget::setVisible(visible); 
} 
+0

Das ist eine gute Antwort, da es keine zuvor gesetzten Fenster-Flags aufhebt. – Oszkar

Verwandte Themen