QLabel нарушает выравнивание по центру макета - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть QVBoxLayout в главном окне, которое центрировано по горизонтали, и в макет я добавил метку с выравниванием AlignCenter и пользовательским QFrame. Когда размер метки меньше, чем у пользовательского фрейма (поле Engli sh), все работает как положено:

enter image description here

Однако, когда размер метки больше, чем у пользовательского фрейма, пользовательский фрейм смещен влево:

enter image description here

Почему это происходит и как это исправить?

Вот 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 Ответ

0 голосов
/ 06 апреля 2020

Используемая вами функция setAlignment() устанавливает только выравнивание для макета , а не его содержимого.

Если вы используете виджет, который имеет максимальный размер и хотите укажите выравнивание, которое должно быть объявлено явно:

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

В противном случае виджет попытается использовать все доступное пространство, но, поскольку в вашем случае это пространство больше, чем требуется, он будет использовать значение по умолчанию выравнивание системы (слева, сверху).

...