2012-01-09 210 views
6

在Qt中,我有一個複合小部件,它由QBoxLayouts中的幾個QLabel組成。當窗口小部件被調整大小時,我希望標籤文本能夠縮放以填充標籤區域,並且我已經實現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,運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) 

如果你不僅需要通過高度以適應文本,但寬度也需要一些aditional的代碼。

+0

設置SizePolicy解決了問題,謝謝。 – glennr 2012-01-10 21:09:47

相關問題