Автоматическое изменение размера текста метки в Qt - странное поведение - PullRequest
8 голосов
/ 10 января 2012

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

Это работает, но, похоже, происходит своего рода цикл обратной связи.Составной виджет размещается в главном окне внутри 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)

1 Ответ

8 голосов
/ 10 января 2012

Я думаю проблема с изменением размера вызвана 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)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...