2015-04-24 285 views

回答

3

下面是解决方案,对于QLabel,从此处发布的解决方案派生而来:https://forum.qt.io/topic/36088/automatically-scale-text-in-qlabels/5

这包括resizeEvent方法的重新实现,其中QLabel的字体大小根据其contentRect的大小进行更新。请注意,Qlabel的sizePolicy必须设置为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_()) 

导致:

enter image description here

更新 - 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) 
+0

我该如何给标签初始尺寸?忽略大小策略后可能吗? – Amen

+0

@Amen好吧,标签的初始大小主要取决于应用程序的布局。但是我可以看到,在标签上设置最小尺寸可能很有用,因此不会因UI的其他元素的拉伸而折叠。查看更新的示例。 –

相关问题