¿Cómo mantener la relación de aspecto de widgets en Qt?

¿Cómo es posible mantener la relación de aspecto de widgets en Qt y qué hay de centrar el widget?

No tiene que implementar su propio administrador de diseño. Puedes hacer con heredar QWidget y QWidget

 int QWidget::heightForWidth( int w ) { return w; } 

para mantenerse en forma Sin embargo, heightForWidth() no funciona en las ventanas de nivel superior en X11, ya que aparentemente el protocolo X11 no es compatible. En cuanto al centrado, puede pasar Qt::AlignCenter como el tercer parámetro de QBoxLayout::addWidget() o el quinto parámetro de QGridLayout::addWidget() .

Nota: en las versiones más nuevas de Qt al menos, QWidget ya no tiene heightForWidth o widthForHeight (por lo que no pueden ser reemplazadas), y por setWidthForHeight(true) tanto setWidthForHeight(true) o setHeightForWidth(true) solo tienen un efecto para los descendientes de QGraphicsLayout .

La respuesta correcta es crear su administrador de diseño personalizado. Eso es posible mediante la subclasificación de QLayout .

Métodos para implementar al subclasificar QLayout

void addItem (elemento QLayoutItem *);
Agrega elemento al diseño.
int count () const;
Devuelve el recuento de elementos.
QLayoutItem * itemAt (int index) const;
Devuelve la referencia del artículo en el índice o 0 si no hay ninguno.
QLayoutItem * takeAt (índice int);
Toma y devuelve un artículo del diseño desde el índice o devuelve 0 si no hay ninguno.
Qt :: Orientations expandingDirections () const;
Devuelve los diseños expandiendo las direcciones.
bool hasHeightForWidth () const;
Indica si el diseño maneja la altura para el cálculo del ancho.
QSize minimumSize () const;
Devuelve el tamaño mínimo de diseños.
void setGeometry (const QRect y rect);
Establece la geometría del diseño y los elementos dentro de él. Aquí debe mantener la relación de aspecto y hacer el centrado.
QSize sizeHint () const;
Devuelve el tamaño preferido para el diseño.

Otras lecturas

  • Mantener la forma cuadrada de un widget en Qt @ Forum Nokia
  • Implementación de un administrador de diseño en Qt @ Forum Nokia
  • Escribir gestores de diseño personalizados @ documentación Qt

Llamar a resizeEvent() resize() desde dentro de resizeEvent() nunca me ha funcionado – en el mejor de los casos provocará parpadeos ya que la ventana se redimensiona dos veces (como lo has hecho), en el peor de los casos, un bucle infinito.

Creo que la forma “correcta” de mantener una relación de aspecto fija es crear un diseño personalizado. Tendrá que anular solo dos métodos, QLayoutItem::hasHeightForWidth() y QLayoutItem::heightForWidth() .