2012-01-09 5 views
6

В Qt У меня есть составной виджет, состоящий из нескольких QLabels, расположенных внутри QBoxLayouts. Когда размер виджета изменен, я хочу, чтобы текст метки был масштабирован, чтобы заполнить область ярлыков, и я внедрил изменение размера текста в resizeEvent.Автоматическое изменение размера текста меток в Qt - странное поведение

Это работает, но, похоже, происходит какая-то контур обратной связи. Составной виджет размещается в главном окне внутри QBoxLayout вместе с некоторыми другими виджетами. Когда основное окно становится меньше, составной виджет первоначально сохраняет свой размер и затем изменяет размер до нужного размера в несколько этапов (около 10-15). Если высота текста установлена ​​более чем в 0,8 раза, высота ярлыка, а затем изменение размера текста и содержимого виджета увеличивается с каждым шагом, пока со временем приложение не сработает.

Это правильный подход для достижения этого эффекта? Если да, то какова может быть проблема с изменением размера?

Ниже представлен код 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) 

(с использованием PyQt4 4.8, Qt 4.7.4, Win 7 & OSX 10.6)

ответ

6

Я думаю, что проблема с изменением размеров, вызванные SizePolicy. Попробуйте установить политику label в размере Ignored, это должно помочь.

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

Является ли это правильный подход для достижения этого эффекта?

Возможно, да, быстрый поиск в документации не дал лучших решений. Но я бы создал подкласс QLabel, а также установил политику и изменил ее размер. Пример:

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) 

Если вам необходимо подгонять текст не только по высоте, но и по ширине, необходим некоторый дополнительный код.

+0

Установка параметра SizePolicy исправила проблему, спасибо. – glennr

Смежные вопросы