在Qt中自动调整标签文本的大小 - 奇怪的行为

gle*_*nnr 8 qt resize pyqt

在Qt中,我有一个复合小部件,它由QBoxLayouts内部的几个QLabel组成.调整窗口小部件的大小时,我希望缩放标签文本以填充标签区域,并且我已在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)
Run Code Online (Sandbox Code Playgroud)

(使用PyQt4 4.8,Qt 4.7.4,Win 7和OSX 10.6)

rec*_*dev 8

我认为调整大小引起的问题SizePolicy.尝试设置它label的大小政策Ignored应该有所帮助.

label.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
Run Code Online (Sandbox Code Playgroud)

这是实现这种效果的正确方法吗?

可能是的,快速搜索文档没有给出更好的解决方案.但我会创建子类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)
Run Code Online (Sandbox Code Playgroud)

如果您不仅需要根据高度来拟合文本,还需要按宽度拟合文本,则需要一些附加代码.