在 Qt 中,当我将小部件添加到布局时,它们默认垂直居中。有没有办法从上到下“列出”小部件而不是垂直居中?
5 回答
使用void QLayout::setAlignment ( Qt::Alignment alignment )
方法根据您的选择设置对齐方式。
如果您有一个QVBoxLayout
并且希望将固定大小的小部件堆叠在顶部,您可以简单地在末尾附加一个垂直拉伸:
layout.addStretch()
如果您有多个拉伸器或其他拉伸项目,您可以指定一个整数拉伸因子参数来定义它们的大小比。
另请参见addStretch和addSpacerItem。
layout.addStretch()
在添加小部件之前和之后添加两个以使它们垂直居中:
layout.addStretch()
layout.addWidget(self.message)
layout.addWidget(self.userid_field)
layout.addWidget(self.password_field)
layout.addWidget(self.loginButton)
layout.addStretch()
不确定这是否回答了您最初的问题,但它是我在谷歌搜索并被引导到此页面时的答案 - 所以它可能对其他人也有用。
我发现这比仅使用layout.setAlignment()
. 直到现在,它一直对我不起作用,当我发现如果您有扩展的小部件并为其设置了最大高度,那么该小部件将不会按照您想要的方式对齐。
这是示例代码,即使我调用. 抱歉,它是用 Python 编写的,但它很容易转换为 C++(我已经多次采用另一种方式)。QTextBrowser()
layout.setAlignment(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_()
以下显式调用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)
适用于几个小部件对齐但:
myLayout.setAlignment(myWidget, Qt.AlignTop)
仅适用于您添加到布局的第一个小部件。毕竟,解决方案还取决于您的小部件的 QSizePolicy。
如果您使用的是 QT creator,您只需在小部件底部添加一个“垂直间隔”。