2013-01-19 81 views
5

這似乎是這樣一個簡單的事情,但我似乎無法弄清楚。如何使按鈕成爲最小寬度。它不斷擴大,以我把它放在佈局的寬度在下面的例子中,QPushButton寬度結束了一樣的QLabel:將QPushButton寬度縮小到最小值

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys 

class MyWindow(QWidget): 

    def __init__(self,parent = None): 

     QWidget.__init__(self,parent) 

     layout = QVBoxLayout() 
     layout.addWidget(QLabel('this is a really, really long label that goes on and on')) 
     layout.addWidget(QPushButton('short button')) 

     self.setLayout(layout) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    window = MyWindow() 
    window.show() 
    sys.exit(app.exec_()) 

回答

2

http://qt-project.org/doc/qt-4.8/qwidget.html#sizePolicy-prophttp://qt-project.org/doc/qt-4.8/qsizepolicy.html#Policy-enum學習如何控制控件大小動態佈局。

如果不單獨改變SizePolicy(你應該)得到滿意的效果,還可以觀察到這些好人:http://qt-project.org/doc/qt-4.8/qspaceritem.html

+1

IIRC QPushButton有固定的最小寬度(我認爲是80),試圖強制使用較小的策略會導致不可預知的結果,因爲這意味着策略將忽略最小寬度。 – chacham15

+1

在我的應用程序中,我有一個QPushButton,它的最小和最大寬度都設置爲16,顯示寬度爲8的圖標。它按預期工作。但是,在OS X中,按鈕與所有其他按鈕的OS X Aqua風格不同,但似乎會恢復爲普通按鈕以實現其大小屬性。所以這是一個需要考慮的副作用。 – ypnos

9

我setMaximumWidth工作

from PyQt4 import QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     layout = QtGui.QHBoxLayout() 
     texts = [":)", 
       "&Short", 
       "&Longer", 
       "&Different && text", 
       "More && text", 
       "Even longer button text", ] 
     for text in texts: 
      btn = QtGui.QPushButton(text) 
      double = text.count('&&') 
      text = text.replace('&', '') + ('&' * double) 
      width = btn.fontMetrics().boundingRect(text).width() + 7 
      btn.setMaximumWidth(width) 
      layout.addWidget(btn) 
     self.setLayout(layout) 

if __name__ == '__main__': 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    mainWin = Window() 
    mainWin.show() 
    sys.exit(app.exec_()) 
+0

這是一個非常好的演示。順便說一句,你可以通過只做'width = btn.fontMetrics()。boundingRect(re.sub('&(?=(?:&&)* [^&])','' ,text)).width()+ 7'。你可以只替換所有後跟偶數個&的'&'。 –

+0

這樣做的好處是'&'get在原地正確處理,而不是被加回到字符串的末尾。 –