2012-01-09 31 views
6

En Qt tengo un widget compuesto que consta de varias QLabels dispuestas dentro de QBoxLayouts. Cuando el widget se redimensiona, quiero que el texto de la etiqueta se escale para llenar el área de la etiqueta y he implementado el cambio de tamaño del texto en resizeEvent.Cambio automático del tamaño del texto de la etiqueta en Qt: comportamiento extraño

Esto funciona pero parece que hay algún tipo de ciclo de retroalimentación. El widget compuesto se coloca en una ventana principal dentro de un QBoxLayout junto con algunos otros widgets. Cuando la ventana principal se hace más pequeña, el widget compuesto inicialmente mantiene su tamaño y luego se redimensiona hacia el tamaño correcto en varios pasos (alrededor de 10-15). Si la altura del texto se establece en más de alrededor de 0,8 veces la altura de la etiqueta, entonces al redimensionar el texto y el widget que lo contiene aumentará de tamaño con cada paso hasta que la aplicación se bloquee.

¿Es este el enfoque correcto para lograr este efecto? Si es así, ¿cuál podría ser el problema con el cambio de tamaño?

A continuación se muestra el código resizeEvent.

def resizeEvent(self, evt): 
     print("resizeEvent", evt.size().width(), evt.size().height()) 
     QFrame.resizeEvent(self, evt) 

     dataLabels = self.dataPanels.values() 

     for label in dataLabels:    
      font = label.font() 
      h = label.height() 
      h2 = h * 0.8 
      font.setPixelSize(h2) 
      label.setFont(font) 

(usando PyQt4 4.8, Qt 4.7.4, Win 7 & OSX 10,6)

Respuesta

6

Creo que el problema con el cambio de tamaño causada por SizePolicy. Intente establecer la política de tamaño label en Ignored, debería ayudar.

label.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) 

Es este el enfoque correcto para lograr este efecto?

Probablemente sí, la búsqueda rápida en la documentación no dio mejores soluciones. Pero crearía la subclase de QLabel, y establecería políticas y redimensionaría allí. Ejemplo:

class StretchedLabel(QLabel): 
    def __init__(self, *args, **kwargs): 
     QLabel.__init__(self, *args, **kwargs) 
     self.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) 

    def resizeEvent(self, evt): 
     font = self.font() 
     font.setPixelSize(self.height() * 0.8) 
     self.setFont(font) 

En caso de tener que ajustar el texto no sólo por la altura, pero por el ancho también, requiere algo de código adicional.

+0

Configurando SizePolicy corrigió el problema, gracias. – glennr

Cuestiones relacionadas