将标签字体大小与PyQt中的布局同步

发布于 2021-01-29 14:59:35

更改标签的字体大小以匹配通过信号/插槽包含的布局大小的具体方法是什么?

关注者
0
被浏览
127
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    以下是QLabel从此处发布的解决方案衍生出来的解决方案:https : //forum.qt.io/topic/36088/automatically-scale-
    text-in-qlabels/5

    这包括resizeEvent方法的重新实现,其中QLabel根据的大小更新的字体大小contentRect。请注意,必须sizePolicy将Qlabel的设置Ignored为此才能正常工作。

    import sys
    from PyQt4 import QtGui
    
    class myQLabel(QtGui.QLabel):
        def __init__(self, *args, **kargs):
            super(myQLabel, self).__init__(*args, **kargs)
    
            self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored,
                                                 QtGui.QSizePolicy.Ignored))
    
            self.setMinSize(14)
    
        def setMinSize(self, minfs):
    
            f = self.font()
            f.setPixelSize(minfs)
            br = QtGui.QFontMetrics(f).boundingRect(self.text())
    
            self.setMinimumSize(br.width(), br.height())
    
        def resizeEvent(self, event):
            super(myQLabel, self).resizeEvent(event)
    
            if not self.text():
                return
    
            #--- fetch current parameters ----
    
            f = self.font()
            cr = self.contentsRect()
    
            #--- find the font size that fits the contentsRect ---
    
            fs = 1                    
            while True:
    
                f.setPixelSize(fs)
                br =  QtGui.QFontMetrics(f).boundingRect(self.text())
    
                if br.height() <= cr.height() and br.width() <= cr.width():
                    fs += 1
                else:
                    f.setPixelSize(max(fs - 1, 1)) # backtrack
                    break
    
            #--- update font size ---
    
            self.setFont(f)
    
    
    class myApplication(QtGui.QWidget):
        def __init__(self, parent=None):
            super(myApplication, self).__init__(parent)
    
            #---- Prepare a Layout ----
    
            grid = QtGui.QGridLayout()
    
            for i in range(3):
                grid.addWidget(myQLabel('some text'), i, 0)  
                grid.setRowStretch(i, i+1)
                grid.setRowMinimumHeight(i, 25)
    
            self.setLayout(grid)
            self.resize(500, 300)
    
    
    if __name__ == '__main__':
    
        app = QtGui.QApplication(sys.argv)
    
        instance = myApplication()  
        instance.show()
    
        sys.exit(app.exec_())
    

    结果是:

    在此处输入图片说明

    更新-resizeEvent的优化:

    下面是该resizeEvent方法的优化版本,应该可以产生更好的性能。它大大减少了寻找最佳字体大小值所需的迭代次数。我还没有进行广泛的测试。

    def resizeEvent(self, event):
        super(myQLabel, self).resizeEvent(event)
    
        if not self.text():
            return
    
        #--- fetch current parameters ----
    
        f = self.font()
        cr = self.contentsRect()
    
        #--- iterate to find the font size that fits the contentsRect ---
    
        dw = event.size().width() - event.oldSize().width()   # width change
        dh = event.size().height() - event.oldSize().height() # height change
    
        fs = max(f.pixelSize(), 1)        
        while True:
    
            f.setPixelSize(fs)
            br =  QtGui.QFontMetrics(f).boundingRect(self.text())
    
            if dw >= 0 and dh >= 0: # label is expanding
    
                if br.height() <= cr.height() and br.width() <= cr.width():
                    fs += 1
                else:
                    f.setPixelSize(max(fs - 1, 1)) # backtrack
                    break
    
            else: # label is shrinking
    
                if br.height() > cr.height() or br.width() > cr.width():
                    fs -= 1
                else:
                    break
    
            if fs < 1: break
    
        #--- update font size ---
    
        self.setFont(f)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看