2012-04-10 14 views

risposta

28

utilizzare il metodo void QLayout::setAlignment (Qt::Alignment alignment) per impostare l'allineamento in base alla propria scelta.

14

Trovo questo un po 'più complicato del semplice utilizzo di layout.setAlignment(). Ha continuato a non funzionare per me fino a poco tempo fa, quando ho capito che se hai widget in espansione per i quali hai impostato l'altezza massima, allora quel widget non sarà allineato come vuoi tu.

Ecco il codice di esempio che fa non top allinea il widget QTextBrowser() anche se chiamo layout.setAlignment(Qt.AlignTop). Spiacente che sia in Python, ma è piuttosto facile tradurre in C++ (sono andato nell'altro modo molte volte).

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

class MyWidget(QWidget): 
    """ 
    Create a widget that aligns its contents to the top. 
    """ 

    def __init__(self, parent=None): 

     QWidget.__init__(self, parent) 

     layout = QVBoxLayout() 

     label = QLabel('label:') 
     layout.addWidget(label) 

     info = QTextBrowser(self) 
     info.setMinimumHeight(100) 
     info.setMaximumHeight(200) 
     layout.addWidget(info)   
     # Uncomment the next line to get this to align top. 
#   layout.setAlignment(info, Qt.AlignTop) 

     # Create a progress bar layout. 
     button = QPushButton('Button 1')   
     layout.addWidget(button)   

     # This will align all the widgets to the top except 
     # for the QTextBrowser() since it has a maximum size set. 
     layout.setAlignment(Qt.AlignTop) 

     self.setLayout(layout) 


if __name__ == '__main__': 

    import sys 

    app = QApplication(sys.argv) 

    widget = MyWidget() 
    widget.show() 
    widget.resize(QSize(900, 400)) 

    app.exec_() 

le seguenti chiamate esplicitamente layout.setAlignment(info, Qt.AlignTop) per ottenere il widget di testo spendere al lavoro.

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

class MyWidget(QWidget): 
    """ 
    Create a widget that aligns its contents to the top. 
    """ 

    def __init__(self, parent=None): 

     QWidget.__init__(self, parent) 

     layout = QVBoxLayout() 

     label = QLabel('label:') 
     layout.addWidget(label) 

     info = QTextBrowser(self) 
     info.setMinimumHeight(100) 
     info.setMaximumHeight(200) 
     layout.addWidget(info)   
     # Uncomment the next line to get this to align top. 
     layout.setAlignment(info, Qt.AlignTop) 

     # Create a progress bar layout. 
     button = QPushButton('Button 1')   
     layout.addWidget(button)   

     # This will align all the widgets to the top except 
     # for the QTextBrowser() since it has a maximum size set. 
     layout.setAlignment(Qt.AlignTop) 

     self.setLayout(layout) 


if __name__ == '__main__': 

    import sys 

    app = QApplication(sys.argv) 

    widget = MyWidget() 
    widget.show() 
    widget.resize(QSize(900, 400)) 

    app.exec_() 
+0

Questo ha risolto anche il mio problema. Non sono proprio sicuro * perché * è necessario impostare una larghezza/altezza minima. Potresti forse esporlo? – Seth

4

Dopo il confronto tra le due soluzioni, sembra che:

myLayout.setAlignment(Qt.AlignTop) 

opere per diversi widget di allineamento ma:

myLayout.setAlignment(myWidget, Qt.AlignTop) 

opere solo per il primo widget si aggiunge al layout . Dopo tutto, la soluzione dipende anche da QSizePolicy dei tuoi widget.

4

Se si dispone di un QVBoxLayout e volete che i vostri widget dimensione fissa di essere impilati in alto, si può semplicemente aggiungere un tratto verticale aggiungere alla fine:

layout.addStretch() 

Se si dispone di più barelle o altri elementi elastici, è possibile specificare un argomento di fattore di stiramento intero che definisce il loro rapporto di dimensione.

Vedere anche addStretch e addSpacerItem.

Non sono sicuro che questo risponda alla tua domanda originale, ma è la risposta a quello che ho avuto su google e su questa pagina, quindi potrebbe essere utile anche per gli altri.

+0

C'è un modo per aggiungere 500 pollici a un post? – Acidic

Problemi correlati