QLabel 破坏了布局的中心对齐

Posted

技术标签:

【中文标题】QLabel 破坏了布局的中心对齐【英文标题】:QLabel disrupting the center alignment of the layout 【发布时间】:2020-04-06 17:04:54 【问题描述】:

我在水平居中的主窗口上有一个QVBoxLayout,在布局中我添加了一个具有AlignCenter 对齐和自定义QFrame 的标签。当标签的大小小于自定义框架(英文框)时,一切都按预期工作:

但是,当标签的大小大于自定义框架时,自定义框架会向左移动:

为什么会发生这种情况,我该如何解决?

这是一个 MCVE:

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication, QFrame, QLabel, QSizePolicy, \
    QStackedLayout, QVBoxLayout, QWidget

app = QApplication([])

main_window = QWidget()
main_window.setMinimumSize(1280, 720)

layout = QVBoxLayout()
layout.setAlignment(Qt.AlignHCenter | Qt.AlignTop)
main_window.setLayout(layout)

label = QLabel()
label.setText("Select Language")
label.setAlignment(Qt.AlignCenter)
label.setFont(QFont("Arial", 40))
layout.addWidget(label)

class Button(QFrame):

    def __init__(self):
        super().__init__()
        stacked_layout = QStackedLayout()

        button = QWidget()
        button_layout = QVBoxLayout()
        text = QLabel()
        text.setText("English")
        text.setAlignment(Qt.AlignCenter)
        button_layout.addWidget(text)
        button_layout.setAlignment(Qt.AlignCenter)
        button.setLayout(button_layout)

        stacked_layout.addWidget(button)
        self.setLayout(stacked_layout)

        self.setFrameStyle(QFrame.Box)
        self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        self.setFixedSize(260, 320)

layout.addSpacing(40)
layout.addWidget(Button())

main_window.show()

app.exec_()

【问题讨论】:

【参考方案1】:

您使用的setAlignment() 函数仅设置布局的对齐方式,而不是其内容。

如果您使用的小部件具有最大尺寸并且想要指定对齐方式,则必须明确声明:

layout.addWidget(Button(), alignment=Qt.AlignCenter)

否则,小部件将尝试使用所有可用空间,但由于在您的情况下空间超过了它所需的空间,它将使用默认的系统对齐方式(左、上)。

【讨论】:

谢谢!顺便问一下,这种行为在文档中记录在哪里? 每个布局类型的addWidget()文档中都有:“默认对齐方式为0,表示widget填满整个单元格。”;这意味着如果您没有指定对齐方式小部件的宽度/高度小于可用大小,它将使用“本地”默认“布局方向”(如“阅读” ):总是在顶部,从左到右的系统在左侧,反之亦然。 注意:这实际上并不是将所有内容居中的正确方法,因为在整个地方使用 Qt.AlignCenter 只是远远超出了需要,而且根本不是这些对象的设计方式.如果你正确地使用了 QHBoxLayouts 和 QVBoxLayouts 和 addQStretch(1) ,那么这一切都可以在任何地方不使用单个 Qt.AlignCenter 的情况下完成——并且结束代码更简单,更清晰 @DennisJensen 不。布局是 VBoxLayout,问题是使用固定宽度小部件获得水平居中,这与拉伸无关。 @DennisJensen 我很清楚你的意思,我正在解释它如何与两个简单小部件的单个 QVBoxLayout 一起工作,使用 5 个嵌套布局真的没有任何意义当您知道小部件的大小属性后就可以使用正确的 QAlignment 时。如果您想提出另一种方法,请不要与正确回答问题的答案相矛盾,只需提出另一个答案,或者至少建议 that您的 意见。

以上是关于QLabel 破坏了布局的中心对齐的主要内容,如果未能解决你的问题,请参考以下文章

带有 CSS 显示的元素:无;破坏布局 - 导致错位

如何在 PyQt5 布局中更紧密地对齐两个小部件?

为啥这个 flexbox 布局在 Safari 中被破坏了?

Angular2 组件标签破坏了 flexbox 布局

Django 模板继承破坏了站点布局

UITabbarController 隐藏标签栏破坏了安全区域布局