2012-01-09 3 views
6

In Qt ho un widget composito costituito da diversi QLabels disposti all'interno di QBoxLayouts. Quando il widget viene ridimensionato, desidero ridimensionare il testo dell'etichetta per riempire l'area dell'etichetta e ho implementato il ridimensionamento del testo in resizeEvent.Ridimensionamento automatico del testo dell'etichetta in Qt - comportamento strano

Questo funziona ma sembra che si verifichi una sorta di ciclo di feedback. Il widget composito viene inserito in una finestra principale all'interno di un QBoxLayout insieme ad altri widget. Quando la finestra principale viene ridotta, il widget composito mantiene inizialmente le sue dimensioni e quindi ridimensiona verso la dimensione corretta in diversi passaggi (circa 10-15). Se l'altezza del testo è impostata su un valore maggiore di circa 0,8 volte l'altezza dell'etichetta, quindi il ridimensionamento del testo e il widget contenente diventano più grandi ad ogni passaggio finché l'app non si arresta in modo anomalo.

È questo l'approccio corretto per ottenere questo effetto? In tal caso, quale potrebbe essere il problema con il ridimensionamento?

Di seguito è riportato il codice 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)

risposta

6

penso problema con il ridimensionamento causato da SizePolicy. Prova a impostare la politica delle dimensioni di label su Ignored.

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

È questo l'approccio corretto per ottenere questo effetto?

Probabilmente sì, la ricerca rapida nella documentazione non ha fornito soluzioni migliori. Ma vorrei creare sottoclasse di QLabel, e fare la configurazione dei criteri e il ridimensionamento lì. Esempio:

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) 

in caso di necessità per adattare il testo non solo per l'altezza, ma di larghezza troppo, qualche codice adizionale richiesto.

+0

Impostazione di SizePolicy risolto il problema, grazie. – glennr