2012-01-08 18 views
5

Cuando tengo QMainWindow con un diseño de cuadrícula, al redimensionarlo con el mouse, no quedará por debajo del tamaño mínimo necesario para que todos los controles se muestren correctamente . En mi aplicación, a veces oculto los controles de forma programática, pero la ventana sigue siendo del mismo tamaño y el resto de los controles se extienden, con demasiado espacio entre ellos. Termino cambiando el tamaño del diálogo manualmente para que no se vea feo.Cómo ajustar el tamaño de un QMainWindow a su tamaño mínimo

¿Puedo establecer programáticamente el tamaño vertical del diálogo en este mínimo que obtengo al cambiar el tamaño manualmente después de que haya ocultado controles en él?

+0

+1 Me siento frustrado por esto también. –

+0

Acabo de descifrarlo, vea mi respuesta a continuación. – sashoalm

Respuesta

0

Este código hará el truco (que sólo cambia el tamaño de la altura):

QWidget widget; 
    widget.resize(widget.width(), widget.minimumHeight()); 
+0

¿Cómo se diferencia esto de 'widget.resize (widget.width(), 1)?' ¿Y hay alguna diferencia entre 0 y 1? (Soy un novato, como obviamente puedes decir.) –

+0

¿Quieres decir que widget.minimumHeight() devuelve 0? Supuse que devuelve el tamaño mínimo necesario para que quepan todos los controles, pero no he comprobado el valor real devuelto por la función. – sashoalm

+0

esto era útil, en el que, al utilizar widgets de muelle, se puede obtener la altura de un widget parte superior/inferior del muelle y luego ajustar el tamaño mínimo de la MainWindow a su altura actual menos la altura de la barra de widgets que desea ocultar. – guitarpicva

1

Hay una jerarquía entre QLayout::SizeConstraint, QWidget::minimumSizeHint, QWidget::minimumSize, y lo puede encontrar en la documentación.

  • QWidget::minimumSize no está configurado de manera predeterminada. Cuando lo es, prevalece sobre QWidget::minimumSizeHint
  • QWidget::minimumSizeHint no es válido si el widget no está en un diseño (lo que significa que se puede cambiar el tamaño a 0 con el mouse); de lo contrario, utilice el definido por el diseño.
  • QLayout::SizeConstraint mantiene el comportamiento de diseño predeterminado de los widgets * directamente * manage. Si anida un diseño A dentro de un diseño B, todos los widgets agregados a A usarán su propiedad. Además, si un widget W en B define su propio diseño, estas restricciones de diseño son las que se aplicarán para el widget W.

Sabiendo eso, sigue estos pasos. Se podría trabajo, no lo probé :):

  • establecer el tamaño mínimo de todos los widgets que utilice.
  • Asegúrese de que la restricción de tamaño de todos sus diseños esté configurada en QLayout::SetDefaultConstraint.
2

he encontrado que el cambio de tamaño del centralWidget en el QMainWindow continuación, cambiar el tamaño de la QMainWindow sí hace el truco. En otras palabras:

from PyQt4 import QtGui 
class MyMainWindow(QtGui.QMainWindow): 
    def __init__(self): 
     # define some widgets and stuff 
    def whenWidgetsAreHidden(self): 
     # this method should be triggered when you hide your widgets 
     self.centralWidget.adjustSize() 
     self.adjustSize() 

Tenga en cuenta que hay otros widgets en QMainWindowLayout. Según esta imagen del Qt Documentation, también hay Widgets Dock y otras cosas que podrían estar presentes. Solo uso el centralWidget para que esta solución funcione para mí.

QMainWindow Layout

Cuestiones relacionadas