addwidget qt qlayout

qt - addwidget - QVBoxLayout: Cómo alinear verticalmente widgets a la parte superior en lugar del centro



addwidget pyqt5 (4)

Después de la comparación entre las dos soluciones, parece que:

myLayout.setAlignment(Qt.AlignTop)

funciona para varias alineaciones de widgets pero:

myLayout.setAlignment(myWidget, Qt.AlignTop)

funciona solo para el primer widget que agrega al diseño. Después de todo, la solución también depende de la QSizePolicy de sus widgets.

En Qt, cuando agrego widgets a mi diseño, están centrados verticalmente por defecto. ¿Hay alguna manera de "Listar" los widgets de arriba a abajo en lugar de centrarlos verticalmente?


Encuentro esto un poco más complicado que solo usar layout.setAlignment() . No funcionó para mí hasta ahora, cuando descubrí que si tiene widgets de expansión para los que establece una altura máxima, entonces ese widget no se alineará de la manera que desee.

Aquí hay un código de ejemplo que no alinea el widget QTextBrowser() aunque yo llamo layout.setAlignment(Qt.AlignTop) . Lamento que esté en Python, pero es bastante fácil de traducir a C ++ (he ido al revés muchas veces).

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

Lo siguiente llama explícitamente a layout.setAlignment(info, Qt.AlignTop) para que funcione el widget de gasto de texto.

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


Si tiene un QVBoxLayout y desea que sus widgets de tamaño fijo se QVBoxLayout en la parte superior, simplemente puede agregar un tramo vertical y agregar el final:

layout.addStretch()

Si tiene múltiples tensores u otros elementos elásticos, puede especificar un argumento de factor de estiramiento entero que defina su proporción de tamaño.

Ver también addStretch y addSpacerItem .

No estoy seguro de si esto responde a su pregunta original, pero es la respuesta a la que tuve cuando busqué en Google y me llevaron a esta página, por lo que podría ser útil para otros también.


use el void QLayout::setAlignment ( Qt::Alignment alignment ) para establecer la alineación de acuerdo con su elección.