Как разместить 2 layouta в одном окне в PyQt6
Я пишу программу на PyQt6, и мне нужно разместить QVBoxLayout
и QHBoxLayout
в одном окне, чтобы QVBoxLayout
с его виджетами был главный, QHBoxLayout
находился внутри QVBoxLayout
.
Я пробовал с помощью addLayout
, но все виджеты перемешивались. Надеюсь понятно объяснил.
Вот код (сокращенный):
main.py:
from PyQt6 import QtWidgets
from PyQt6.QtWidgets import QApplication, QMainWindow
from quiz_application import QuizApplication
from enter_or_register import EnterOrRegister
from login_window import LoginWindow
import sys
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Quiz Application")
self.setGeometry(300, 50, 643, 500)
self.centralwidget = QtWidgets.QWidget()
self.centralwidget.setObjectName("centralwidget")
self.setCentralWidget(self.centralwidget)
self.quizApplication = QuizApplication()
self.enterOrRegister = EnterOrRegister()
self.loginwindow = LoginWindow()
self.stack = QtWidgets.QStackedWidget(self)
self.ix_stack_1 = self.stack.addWidget(self.quizApplication)
self.ix_stack_2 = self.stack.addWidget(self.enterOrRegister)
self.ix_stack_3 = self.stack.addWidget(self.loginwindow)
self.QVBlayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.QVBlayout.addWidget(self.stack)
self.quizApplication.start_button.clicked.connect(
self.on_start_button_clicked)
# functions
def on_start_button_clicked(self):
self.stack.setCurrentIndex(1)
self.setStyleSheet("""border-image: unset;""")
StyleSheet = """
#centralwidget {
border-image: url(images/battle_images/marathon_battle-photo_2.jpg)"\
"0 0 0 0 stretch stretch;
}
#welcome_label {
font-size: 23px;
}
#start_button {
font-size: 20px;
color: #ADFF2F;
background-color: #008000;
}
#select_enter_register {
font-size: 21px;
color: #00FA9A;
}
#instructional_label {
font-size: 20px;
color: rgba(135, 155, 200, 226);
}
#register_label {
font-size: 20px;
color: rgba(35, 255, 121, 226);
}
#enter_button {
font-size: 20px;
background-color: #008000;
color: rgba(255, 255, 0, 226);
}
"""
def application_setup():
app = QApplication(sys.argv)
app.setStyleSheet(StyleSheet)
window = MainWindow()
window.show()
sys.exit(app.exec())
if __name__ == "__main__":
application_setup()
enter_or_register.py
from PyQt6 import QtCore, QtWidgets
from PyQt6.QtWidgets import QWidget
from PyQt6.QtGui import QPixmap
class EnterOrRegister(QWidget):
def __init__(self):
super().__init__()
self.select_enter_register = QtWidgets.QLabel(self)
self.select_enter_register.setObjectName("select_enter_register")
self.select_enter_register.setText("Enter or register")
self.select_enter_register.setWordWrap(False)
self.select_enter_register.setAlignment(
QtCore.Qt.AlignmentFlag.AlignCenter
| QtCore.Qt.AlignmentFlag.AlignVCenter
)
self.select_enter_register.adjustSize()
self.enter_button = QtWidgets.QPushButton(self)
self.enter_button.setObjectName("enter_button")
self.enter_button.setText("Enter")
self.enter_button.setFixedSize(300, 100)
self.register_label = QtWidgets.QLabel(self)
self.register_label.setObjectName("register_label")
self.register_label.setText("Not logged in yet?")
self.register_label.setWordWrap(False)
self.register_label.setAlignment(
QtCore.Qt.AlignmentFlag.AlignCenter
)
self.register_label.adjustSize()
self.register_button = QtWidgets.QPushButton(self)
self.register_button.setObjectName("register")
self.register_button.setText("Register")
self.register_button.adjustSize()
self.google_logo = QPixmap("images/logos/google_logo.png")
self.google_logo_label = QtWidgets.QLabel(self)
self.google_logo_label.setPixmap(self.google_logo)
self.google_logo_label.adjustSize()
self.git_hub_logo = QPixmap("images/logos/GitHub_logo.png")
self.git_hub_logo_label = QtWidgets.QLabel(self)
self.git_hub_logo_label.setPixmap(self.git_hub_logo)
self.git_hub_logo_label.adjustSize()
self.QHB_layout = QtWidgets.QHBoxLayout(self)
# вот мне нужно чтобы вот это QHB_layout находился внутри QVB_layout.
self.QVB_layout = QtWidgets.QVBoxLayout(self)
self.QVB_layout.addWidget(
self.select_enter_register,
alignment=QtCore.Qt.AlignmentFlag.AlignTop)
self.QVB_layout.addWidget(
self.enter_button,
alignment=QtCore.Qt.AlignmentFlag.AlignCenter)
self.QVB_layout.addWidget(
self.register_label,
alignment=QtCore.Qt.AlignmentFlag.AlignCenter)
self.QVB_layout.addWidget(
self.register_button,
alignment=QtCore.Qt.AlignmentFlag.AlignTop
)
self.QHB_layout.addWidget(
self.google_logo_label,
alignment=QtCore.Qt.AlignmentFlag.AlignBottom)
self.QHB_layout.addWidget(
self.git_hub_logo_label,
alignment=QtCore.Qt.AlignmentFlag.AlignBottom)
self.QHB_layout.addLayout(self.QVB_layout)
Источник: Stack Overflow на русском