В Qt, когда я добавляю виджеты в свой макет, по умолчанию они по вертикали по центру. Есть ли способ «Список» виджетов сверху вниз, а не центрировать их по вертикали?QVBoxLayout: как вертикально выровнять виджеты вверху, а не центру
ответ
использование void QLayout::setAlignment (Qt::Alignment alignment)
способ установить выравнивание в соответствии с вашим выбором.
Я считаю это немного более сложным, чем просто использование layout.setAlignment()
. Он продолжал работать не для меня до тех пор, пока я не понял, что если у вас есть расширение виджета, на которое установлена максимальная высота, то этот виджет не будет выровнен так, как вы хотите.
Вот пример кода, который делает не верхний выравнивает виджет QTextBrowser()
, хотя я звоню layout.setAlignment(Qt.AlignTop)
. Извините, что он находится в Python, но его довольно легко перевести на C++ (я пошел другим путем много раз).
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_()
После сравнения между двумя решениями, кажется, что:
myLayout.setAlignment(Qt.AlignTop)
работает для нескольких виджетов alignement но:
myLayout.setAlignment(myWidget, Qt.AlignTop)
работает только для первого виджета добавить в макете , В конце концов, решение зависит также от QSizePolicy ваших виджетов.
Если у вас есть QVBoxLayout
и хотите, чтобы ваши виджеты Фикс.разм быть уложены в верхней части, вы можете просто добавить вертикальную натяжку добавить конец:
layout.addStretch()
Если у вас есть несколько носилок или другие предметов, натяжные, вы можете указать аргумент целочисленного коэффициента растяжения, который определяет их соотношение размеров.
См. Также addStretch и addSpacerItem.
Не уверен, отвечает ли этот вопрос на ваш первоначальный вопрос, но это ответ на тот, который у меня был при поиске в Google и на эту страницу, поэтому он может быть полезен и для других.
Есть ли способ добавить 500 палец вверх к сообщению? – Acidic
Это также решило мою проблему. Я не совсем уверен * почему * нужно установить минимальную ширину/высоту. Не могли бы вы объяснить это? – Seth