2012-05-25 9 views
11

Tengo un widget personalizado QTextEdit que tiene su propio agarre de cambio de tamaño en la esquina. Puedo cambiar el tamaño del widget de texto, sin embargo, el diseño que está dentro no cambia con el cambio de tamaño de la edición de texto.Cómo forzar la actualización/cambio de tamaño del diseño cuando el niño maneja el tamaño?

¿Hay alguna forma de decirle al diseño de administración que se vuelva a calcular en función del cambio de tamaño independiente en uno de sus widgets?

Respuesta

20

El diseño respeta el sizeHint() y el minimalSizeHint() de sus hijos (no el size()). Por lo tanto, debe volver a implementar estos dos métodos virtuales y devolver el tamaño que desea forzar. Cada vez que su tamaño cambia de sugerencia, debe llamar updateGeometry() en su propio widget para desencadenar una actualización de la presentación en la que el widget se coloca en

Ver documentación:.

  • virtual QSize QWidget::sizeHint() const

    Esta propiedad tiene el tamaño recomendado para el widget.
    [...]

  • virtual QSize QWidget::minimumSizeHint() const

    Esta propiedad contiene el tamaño mínimo recomendado para el widget.
    [...]
    QLayout nunca cambiará el tamaño de un widget a un tamaño inferior a la sugerencia de tamaño mínimo a menos que se establezca minimumSize() o que la política de tamaño se establezca en QSizePolicy :: Ignore. Si se establece minimumSize(), la sugerencia de tamaño mínimo se ignorará.

Así, a fuerza de un tamaño mínimo de el widget, poner en práctica minimumSizeHint() devolviendo su mínimo; a forzar un tamaño fijo, implementar ambos devolviendo el mismo tamaño.

también recomiendo la lectura de la siguiente sección en la página de documentación "Layout Management":

widgets personalizados en los diseños

Al realizar su propia clase de widget, también se debe comunicar sus propiedades de diseño. Si el widget tiene uno de los diseños de Qt, esto ya está solucionado. Si el widget no tiene ningún widgets hijos, o utiliza el diseño manual, puede cambiar el comportamiento del widget usando cualquiera o todos de los siguientes mecanismos:

  • reimplementar QWidget :: sizeHint() para devolver el tamaño preferido del widget.
  • Reimplementar QWidget :: minimumSizeHint() para devolver el tamaño más pequeño que puede tener el widget.
  • Llame a QWidget :: setSizePolicy() para especificar los requisitos de espacio del widget.

Llame a QWidget :: updateGeometry() siempre que cambie la sugerencia de tamaño, la sugerencia de tamaño mínimo o la política de tamaño. Esto causará un nuevo cálculo del diseño.Múltiples llamadas consecutivas a QWidget :: updateGeometry() solo causarán un recálculo de diseño.


Update (ver comentarios):

También puede forzar un tamaño (o sólo la altura/anchura), llamando al:

QWidget::setFixedSize(QSize); 
QWidget::setFixedHeight(int); 
QWidget::setFixedWidth(int); 

Estos métodos simplemente establecen el tamaño insinúa el valor dado y llama al updateGeometry() AFAIK. Pero tal vez hacen un poco más desde (como se ve en los comentarios) esta fue la única forma que pude encontrar para resolver el problema aquí.

+0

Gracias. Agregué esas funciones, pero solo parecían llamarse cuando los widgets se construyeron por primera vez. Cuando cambio el tamaño del diseño, no se vuelven a llamar, a pesar de que obviamente los widgets están cambiando de tamaño. – George

+0

¿También intentó llamar 'updateGeometry()' después? ¿Qué tipo de diseño estás usando? ¿Comprueba dos veces si hay algún error al agregar el widget al diseño? Sin usar el control de cambio de tamaño, ¿su 'QTextEdit' actúa como siempre en los cambios de diseño (cambio de tamaño del widget principal)? – leemes

+0

Bueno, esto es lo que estoy haciendo. No soy un genio en Qt ni nada. http://pastebin.com/mRNLZEAp Recorté todo lo que no era relevante. Si llamo a updateGeometry() en cualquier lugar, pierdo la capacidad de cambiar el tamaño de textedit. – George

Cuestiones relacionadas