2013-01-19 7 views
5

Sembra una cosa così semplice, ma non riesco a capirlo. Come faccio a rendere il pulsante la larghezza minima. Mantiene espansione per la larghezza del tracciato ho messo in Nell'esempio seguente, la larghezza QPushButton finisce lo stesso del QLabel:.Riduci al minimo la larghezza di 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_()) 

risposta

2

Vedere http://qt-project.org/doc/qt-4.8/qwidget.html#sizePolicy-prop e http://qt-project.org/doc/qt-4.8/qsizepolicy.html#Policy-enum per imparare su come controllare widget di dimensionamento in un layout dinamico.

Se non si ottengono risultati soddisfacenti cambiando il SizePolicy da solo (si dovrebbe), si potrebbe anche prendere in considerazione questi bravi ragazzi: http://qt-project.org/doc/qt-4.8/qspaceritem.html

+1

IIRC QPushButton ha un la larghezza minima fissa (di 80 penso), cercando di forzarla ad essere più piccola con un criterio, causerà risultati imprevedibili poiché ciò significa che la politica ignorerà la larghezza minima. – chacham15

+1

Nella mia applicazione ho un QPushButton con larghezza minima e massima impostata su 16, visualizzando un'icona di larghezza 8. Funziona come previsto. Tuttavia, in OS X il pulsante non ha lo stesso stile di OS X Aqua di tutti gli altri pulsanti, ma sembra essere ripristinato su un semplice pulsante per soddisfare le sue proprietà dimensionali. Quindi questo è un effetto collaterale che deve essere considerato. – ypnos

9

setMaximumWidth funziona per me

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

Questa è una demo molto bella. A proposito, puoi trasformare il testo senza passaggi intermedi semplicemente facendo 'width = btn.fontMetrics(). BoundingRect (re.sub ('& (? = (?: &&) * [^ &])', '' , testo)). width() + 7'. Puoi semplicemente sostituire tutti '&' che sono seguiti da un numero pari di '&'. –

+0

Questo ha il vantaggio che '&' viene elaborato correttamente sul posto invece di essere aggiunto alla fine della stringa. –