В Qt, когда я добавляю виджеты в свой макет, они по умолчанию по вертикали. Есть ли способ "Список" виджетов сверху вниз, а не центрировать их по вертикали?
QVBoxLayout: как вертикально выравнивать виджеты вверху, а не центру
Ответ 1
используйте void QLayout::setAlignment ( Qt::Alignment alignment )
метод для установки выравнивания по вашему выбору.
Ответ 2
Я считаю это немного сложнее, чем просто использовать layout.setAlignment()
. Он продолжал работать не для меня до тех пор, пока я не понял, что если у вас есть расширение виджета, на которое установлена максимальная высота, то этот виджет не будет выровнен так, как вы хотите.
Вот пример кода, который не выравнивает виджет QTextBrowser()
, даже если я вызываю layout.setAlignment(Qt.AlignTop)
. Извините, что он находится в Python, но его довольно легко перевести на С++ (я пошел другим путем много раз).
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_()
Следующее явно вызывает layout.setAlignment(info, Qt.AlignTop)
, чтобы заставить виджет расходуемого текста работать.
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_()
Ответ 3
После сравнения между двумя решениями, кажется, что:
myLayout.setAlignment(Qt.AlignTop)
работает для нескольких выравниваний виджета, но:
myLayout.setAlignment(myWidget, Qt.AlignTop)
работает только для первого виджета, который вы добавляете в макет. В конце концов, решение зависит также от QSizePolicy ваших виджетов.
Ответ 4
Если у вас есть QVBoxLayout
и хотите, чтобы виджеты фиксированного размера были уложены вверху, вы можете просто добавить вертикальное растяжение, добавив конец:
layout.addStretch()
Если у вас есть несколько носилок или другие элементы растяжения, вы можете указать аргумент коэффициента растяжения целого числа, который определяет их соотношение размеров.
См. также addStretch и addSpacerItem.
Не уверен, отвечает ли этот вопрос на ваш первоначальный вопрос, но это ответ на тот, который был у меня при поиске в Google и его ведении на эту страницу - так что это может быть полезно и для других.