56

在 Qt 中,当我将小部件添加到布局时,它们默认垂直居中。有没有办法从上到下“列出”小部件而不是垂直居中?

4

5 回答 5

47

使用void QLayout::setAlignment ( Qt::Alignment alignment )方法根据您的选择设置对齐方式。

于 2012-04-10T04:31:48.827 回答
41

如果您有一个QVBoxLayout并且希望将固定大小的小部件堆叠在顶部,您可以简单地在末尾附加一个垂直拉伸:

layout.addStretch()

如果您有多个拉伸器或其他拉伸项目,您可以指定一个整数拉伸因子参数来定义它们的大小比。

另请参见addStretchaddSpacerItem

layout.addStretch()在添加小部件之前和之后添加两个以使它们垂直居中:

    layout.addStretch()
    layout.addWidget(self.message)
    layout.addWidget(self.userid_field)
    layout.addWidget(self.password_field)
    layout.addWidget(self.loginButton)
    layout.addStretch()

不确定这是否回答了您最初的问题,但它是我在谷歌搜索并被引导到此页面时的答案 - 所以它可能对其他人也有用。

于 2017-06-12T13:16:15.043 回答
27

我发现这比仅使用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_()
于 2013-02-15T17:21:17.337 回答
9

比较两种解决方案后,似乎:

myLayout.setAlignment(Qt.AlignTop)

适用于几个小部件对齐但:

myLayout.setAlignment(myWidget, Qt.AlignTop)

仅适用于您添加到布局的第一个小部件。毕竟,解决方案还取决于您的小部件的 QSizePolicy。

于 2014-04-16T14:07:50.550 回答
2

如果您使用的是 QT creator,您只需在小部件底部添加一个“垂直间隔”。

于 2021-01-18T04:56:47.317 回答