2013-05-09 8 views
7

Ich habe ein QGLWidget, das ich auf eine bestimmte Auflösung skalieren möchte (größer als das enthaltene Fenster). Meine Absicht ist, dass das Fenster erweitert wird, bis das Widget in das Innere passt, aber keine Möglichkeit findet, es zu tun.Größe des Fensters an den Inhalt anpassen

Ich habe mehrere Befehle versucht, nachdem ich die Größe des QGLWidget geändert habe, damit es ohne Erfolg funktioniert. Ich werde die Ergebnisse hier auflisten:

  • nichts anderes tun: Das Widget überlappt das ganze Fenster. Irgendwann wird es die Größe verändert wird wieder in die kleineren Fenster passen
  • mainWindow.adjustSize(): Das Widget auf der Größe verändert wird (0, 0)
  • mainWindow.resize(mainWindow.sizeHint()): oben
  • mainWindow.resize(mainWindow.minimumSizeHint()): siehe oben

Ich habe auch gelesen in this thread, dass vor der mainWindow resize I die Ereignisschleife ausgeführt werden muss, um die neuen Größen neu zu berechnen, also habe ich QCoreApplication::processEvents eingefügt, um dies zu tun, ohne sichtbaren Effekt.

Wie ändere ich die Größe des Fensters über das Widget?

bearbeiten

Die GLWidget ist nicht das einzige Widget des Fensters. Es ist in Splitter zusammen mit einer Gruppenbox eingebettet.

Antwort

6

http://qt-project.org/doc/qt-4.8/qwidget.html#sizePolicy-prop

http://qt-project.org/doc/qt-4.8/qsizepolicy.html#Policy-enum

http://qt-project.org/doc/qt-4.8/qwidget.html#setFixedSize

So davon aus, dass Sie in Ihrem QMainWindow als zentrales Widget Ihre QGLWidget verschachtelt haben, müssen Sie die Größe Politik Ihres QGLWidget einzustellen.

Zum Beispiel:

QGLWidget * glw; // in your header for QMainWindow 

...

// In your constructor for QMainWindow 
glw = new QGLWidget; 
this->setCentralWidget(glw); 
glw->setFixedSize(500, 500); 

this->adjustSize(); 

Hoffnung, das hilft.

+0

Während dies wirklich ändert die Größe des Fensters auf die benötigte Größe verhindert durch den Benutzer von der weiteren Ändern der Größe:

Das Fenster und Bild-Widget kann mit diesem Code auf das Bild des Originalgröße verkleinert werden. Aus der Dokumentation: 'Setzt sowohl die minimale als auch die maximale Größe des Widgets auf s und verhindert so, dass es immer größer oder kleiner wird. Ich habe gerade versucht, die alten Minimal- und Maximalgrößen zu speichern und wiederherzustellen . – Nobody

+0

Statt 'setFixedSize()' versuchen Sie 'setMinimumSize()' und verwenden Sie 'setSizePolicy()'. Sie haben wirklich eine Menge Kontrolle darüber, wie sich die Dinge mit 'setSizePolicy()' ausdehnen und reagieren. 'setFixedSize()' macht eine Menge Dinge gleichzeitig, also ist es in diesem Fall wahrscheinlich nicht das, was Sie wollen. – phyatt

+0

'minimumSize' scheint mir auch das Falsche zu sein. Der Benutzer sollte die Größe beliebig ändern können. Ich brauche nur das Fenster, um auf die Größe zu kommen, die der gewünschten Größe des 'QGLWidget' entspricht. – Nobody

1

Ich habe eine App, die Ihren Anforderungen sehr ähnlich sein musste, also werde ich hier meine Lösung posten. Ein Bild über dem Fenster, das frei erweiterbar und schrumpffähig ist und auf die Originalgröße geändert werden kann und danach erweiterbar/schrumpffähig bleibt.

Ich habe ein QLabel-Widget verwendet, um das Bild anzuzeigen, aber es sollte auch mit anderen Widget-Typen funktionieren. Ich habe das Widget mit einer Anfangsgröße und der QSizePolicy::Ignored erstellt.

label->resize (w, h); // initial size 
label->setSizePolicy (QSizePolicy::Ignored, QSizePolicy::Ignored); 

Der Label-Widget wurde in einem QVBoxLayout mit einem paar Tasten in dem Fenster, aber das kann auch mit anderen Layout-Typen arbeiten.

label->resize (w, h); // change to original size 
label->setMinimumSize (w, h); // prevent it from collapsing to zero immediately 
window->adjustSize(); // resize the window 
label->setMinimumSize (0, 0); // allow shrinking afterwards 
+0

Leider funktioniert das nicht für mich.Das Widget ist in der Größe geändert, aber die 'adjustSize()' auf dem Fenster minimiert das Fenster unterhalb der Größe des Widgets, möglicherweise durch die Splitter, die ich verwende. – Nobody