Как разместить 2 layouta в одном окне в PyQt6

Рейтинг: 1Ответов: 1Опубликовано: 15.08.2023

Я пишу программу на 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)

Ответы

▲ 1Принят

Вы не предоставили модуль login_window.py ?

Я отметил для вас строки, в которые внес изменения.

import sys
'''
from PyQt6 import QtWidgets
from PyQt6.QtWidgets import QApplication, QMainWindow
'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

#from quiz_application import QuizApplication
class QuizApplication(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Quiz Application")
        self.setGeometry(300, 50, 645, 500)

        self.welcome_label = QtWidgets.QLabel(self)
        self.welcome_label.setObjectName("welcome_label")
        self.welcome_label.setText("Welcome to Marathon Battle!")
        self.welcome_label.setWordWrap(False)
        self.welcome_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)

        self.start_button = QtWidgets.QPushButton(self)
        self.start_button.setObjectName("start_button")
        self.start_button.setText("Start Quiz")
        self.start_button.adjustSize()

        self.quiz_QVBlayout = QtWidgets.QVBoxLayout(self)
        self.quiz_QVBlayout.addWidget(
            self.welcome_label,
            alignment=QtCore.Qt.AlignmentFlag.AlignTop
        )
        self.quiz_QVBlayout.addWidget(
            self.start_button,
            alignment=QtCore.Qt.AlignmentFlag.AlignBottom
        )
        
        
#from login_window import LoginWindowfrom login_window import LoginWindow
class LoginWindow(QWidget):                                                # ???  
    def __init__(self):
        super().__init__()
        
        self.label = QtWidgets.QLabel('LoginWindow')
        font = QtGui.QFont()
        font.setFamily("Copperplate Gothic Bold")
        font.setPointSize(24)
        self.label.setFont(font)
        
        self.layout = QtWidgets.QVBoxLayout(self)
        self.layout.addWidget(self.label,
            alignment=QtCore.Qt.AlignmentFlag.AlignCenter)
        

#from enter_or_register import EnterOrRegister
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("Ok.png")                              # ! Ok.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("Ok.png")                             # ! Ok.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)
        self.QHB_layout = QtWidgets.QHBoxLayout()
# --------------------------------------------> ^ <---------- тут НЕ НАДО писать self

# вот мне нужно чтобы вот это QHB_layout находился внутри QVB_layout.

        self.QVB_layout = QtWidgets.QVBoxLayout(self) # <---- тут НАДО писать 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.AlignHCenter | QtCore.Qt.AlignmentFlag.AlignBottom)
        self.QHB_layout.addWidget(
            self.git_hub_logo_label,
            alignment=QtCore.Qt.AlignmentFlag.AlignHCenter | QtCore.Qt.AlignmentFlag.AlignBottom)

#-        self.QHB_layout.addLayout(self.QVB_layout)
# !!! +++
        self.QVB_layout.addLayout(self.QHB_layout)                            # !!! +++


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.enterOrRegister.register_button.clicked.connect(               # !!! +++
            self.on_register_button_clicked)                                # !!! +++
                
        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;""")
        
    def on_register_button_clicked(self):                                   # !!! +++
        self.stack.setCurrentIndex(2)                                       # !!! +++


StyleSheet = """
#centralwidget {
    border-image: url(background.png)"\
    "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()

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения