2013-01-19 16 views
5

Wydaje się to być tak prostą rzeczą, ale nie mogę tego zrozumieć. Jak ustawić przycisk na minimalną szerokość. Utrzymuje rozszerzenie szerokości układzie I umieścić go w W poniższym przykładzie, szerokość QPushButton kończy się tak samo jak QLabel.Zmniejsz szerokość QPushButton do minimum

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_()) 

Odpowiedz

2

Zobacz http://qt-project.org/doc/qt-4.8/qwidget.html#sizePolicy-prop i http://qt-project.org/doc/qt-4.8/qsizepolicy.html#Policy-enum aby dowiedzieć się, w jaki sposób kontrolować widget zaklejanie w dynamiczny układ.

Jeśli nie uzyskać zadowalających wyników poprzez zmianę SizePolicy sam (zalecana), można również zajrzeć do tych miłych facetów: http://qt-project.org/doc/qt-4.8/qspaceritem.html

+1

IIRC QPushButton ma stała minimalna szerokość (80 myślę), starając się zmusić ją do zmniejszenia z polityką spowoduje nieprzewidywalne wyniki, ponieważ oznacza to, że polityka zignoruje minimalną szerokość. – chacham15

+1

W mojej aplikacji mam QPushButton z minimalną i maksymalną szerokością ustawioną na 16, wyświetlającą ikonę o szerokości 8. Działa zgodnie z przeznaczeniem. Jednak w OS X przycisk nie ma takiego samego stylu OS X Aqua jak wszystkie inne przyciski, ale wydaje się, że został przywrócony do zwykłego przycisku, aby spełnić jego właściwości rozmiaru. Jest to efekt uboczny, który należy wziąć pod uwagę. – ypnos

9

setMaximumWidth działa na mnie

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

To jest bardzo ładne demo. Nawiasem mówiąc, możesz przekształcić tekst bez pośrednich kroków, wykonując 'width = btn.fontMetrics(). BoundingRect (re.sub ('& (? = (?: &&) * [^ &])', '' , tekst)). width() + 7'. Możesz po prostu zastąpić wszystkie '&', które są poprzedzone parzystą liczbą '&'. –

+0

Ma to tę zaletę, że '&' jest przetwarzane poprawnie w miejscu zamiast dodawania z powrotem do końca łańcucha. –

Powiązane problemy