Как сделать переход между страницами в одном окне?

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

Пытаюсь реализовать игру. Изначально мы попадаем в меню

Меню игры.

Дальше идёт развилка. Либо сразу начать игру или же настроить игру.

У меня идёт проблема с реализацией перехода между страницами. Начальную страницу и станицу настроек сделал в Qt Designer.

Я уже пробовал найти что-то в интернете, но безуспешно.
Прошу помощи. Заранее спасибо!

main.py

import sys
import PyQt5
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIcon
import IntroPage
import SettingsPage

class Intro(QtWidgets.QMainWindow):
    def __init__(self):
        super(Intro,self).__init__()
        self.IntroPage = IntroPage.Ui_MainWindow()
        self.IntroPage.setupUi(self)

app = QtWidgets.QApplication([])
application = Intro()
application.show()

sys.exit(app.exec())`

IntroPage.py (Код сделан в Qt Designer.)

# -*- coding: utf-8 -*-

import sys
import PyQt5
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIcon
import SettingsPage
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1280, 720)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("../../Downloads/Safe.png"), QtGui.QIcon.Normal, 
QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(0, 0, 1280, 720))
        font = QtGui.QFont()
        font.setPointSize(24)
        self.label.setFont(font)
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap("../../Downloads/TV - 1.jpg"))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(490, 250, 300, 90))
        font = QtGui.QFont()
        font.setFamily("Comic Relief")
        font.setPointSize(24)
        self.pushButton.setFont(font)
        self.pushButton.setStyleSheet("QPushButton {\n"
                                      "    color:#E2E6ED;\n"
                                      "    background-color:#353B47;\n"
                                      "    border:7px solid #191E1D;\n"
                                      "    border-radius:25;\n"
                                      "}\n"
                                      "QPushButton:pressed {\n"
                                      "    background-color:#2A2F37;\n"
                                      "}")
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(490, 370, 300, 90))
        font = QtGui.QFont()
        font.setFamily("Comic Relief")
        font.setPointSize(24)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setStyleSheet("QPushButton {\n"
                                        "    color:#E2E6ED;\n"
                                        "    background-color:#353B47;\n"
                                        "    border:7px solid #191E1D;\n"
                                        "    border-radius:25;\n"
                                        "}\n"
                                        "QPushButton:pressed {\n"
                                        "    background-color:#2A2F37;\n"
                                        "}")
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "SafeCracker"))
        self.pushButton.setText(_translate("MainWindow", "НАЧАТЬ ИГРУ"))
        self.pushButton_2.setText(_translate("MainWindow", "НАСТРОЙКИ"))
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Каким способом я могу перейти к настройкам?

Ответы

▲ 0

Класс QStackedWidget предоставляет стек виджетов, в котором одновременно виден только один виджет.

import sys
# ??? import PyQt5
from PyQt5 import QtCore, QtGui, QtWidgets
# ??? from PyQt5.QtGui import QIcon

# ??? import SettingsPage

#from IntroPage import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1280, 720)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("../../Downloads/Safe.png"), QtGui.QIcon.Normal, 
QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(0, 0, 1280, 720))
        font = QtGui.QFont()
        font.setPointSize(24)
        self.label.setFont(font)
        self.label.setText("")
# ---
#        self.label.setPixmap(QtGui.QPixmap("lena.jpg").scaled(250, 250))
        self.label.setObjectName("label")
        
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(490, 250, 300, 90))
        font = QtGui.QFont()
        font.setFamily("Comic Relief")
        font.setPointSize(24)
        self.pushButton.setFont(font)
        self.pushButton.setStyleSheet("QPushButton {\n"
                                      "    color:#E2E6ED;\n"
                                      "    background-color:#353B47;\n"
                                      "    border:7px solid #191E1D;\n"
                                      "    border-radius:25;\n"
                                      "}\n"
                                      "QPushButton:pressed {\n"
                                      "    background-color:#2A2F37;\n"
                                      "}")
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(490, 370, 300, 90))
        font = QtGui.QFont()
        font.setFamily("Comic Relief")
        font.setPointSize(24)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setStyleSheet("QPushButton {\n"
                                        "    color:#E2E6ED;\n"
                                        "    background-color:#353B47;\n"
                                        "    border:7px solid #191E1D;\n"
                                        "    border-radius:25;\n"
                                        "}\n"
                                        "QPushButton:pressed {\n"
                                        "    background-color:#2A2F37;\n"
                                        "}")
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "SafeCracker"))
        self.pushButton.setText(_translate("MainWindow", "НАЧАТЬ ИГРУ"))
        self.pushButton_2.setText(_translate("MainWindow", "НАСТРОЙКИ"))


# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class Intro(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(Intro,self).__init__()
#        self.introPage = Ui_MainWindow()
#        self.introPage.setupUi(self)
        self.setupUi(self)
        
        layout =  QtWidgets.QGridLayout(self.centralwidget)
        layout.addWidget(self.label, 0, 0, 4, 1)
        layout.addWidget(self.pushButton, 1, 1, 1, 1)
        layout.addWidget(self.pushButton_2, 2, 1, 1, 1)
        layout.addWidget(QtWidgets.QLabel(), 0, 2, 4, 1)


class Page_2(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__()
        
        self.parent = parent

        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)   

        self.label = QtWidgets.QLabel('Можно НАЧАТЬ ИГРУ',  
            alignment=QtCore.Qt.AlignCenter)
        font = QtGui.QFont("Comic Relief", 25)
        self.label.setFont(font)
        
        self.pushButton = QtWidgets.QPushButton('на Page_1', self.centralwidget)
        self.pushButton.clicked.connect(self._page_1)
        
        layout =  QtWidgets.QVBoxLayout(self.centralwidget)
        layout.addWidget(self.label)
        layout.addWidget(self.pushButton)
        
    def _page_1(self): 
        self.parent.stackWidget.setCurrentIndex(0)


class Page_3(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__()
        
        self.parent = parent

        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)   

        self.label = QtWidgets.QLabel('Тут НАСТРОЙКИ',  
            alignment=QtCore.Qt.AlignCenter)
        font = QtGui.QFont("Comic Relief", 25)
        self.label.setFont(font)
        
        self.pushButton = QtWidgets.QPushButton('на Page_1', self.centralwidget)
        self.pushButton.clicked.connect(self._page_1)
        
        layout =  QtWidgets.QVBoxLayout(self.centralwidget)
        layout.addWidget(self.label)
        layout.addWidget(self.pushButton)
        
    def _page_1(self): 
        self.parent.stackWidget.setCurrentIndex(0)
        

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)
        
        self.setStyleSheet("""
            QMainWindow {
                border-image: url(boy.jpg) 0 0 0 0  ;                  /* <---- */
            }
        """)
        
        self.stackWidget = QtWidgets.QStackedWidget()
        
        layout =  QtWidgets.QHBoxLayout(self.centralwidget)
        layout.addWidget(self.stackWidget)
        
        self.page_1 = Intro()
        self.page_1.pushButton.clicked.connect(self._page_2)
        self.page_1.pushButton_2.clicked.connect(self._page_3)
        self.stackWidget.addWidget(self.page_1)
        
        self.page_2 = Page_2(self)
        self.stackWidget.addWidget(self.page_2)

        self.page_3 = Page_3(self)
        self.stackWidget.addWidget(self.page_3)
        
    def _page_2(self): 
        self.stackWidget.setCurrentIndex(1)
        
    def _page_3(self): 
        self.stackWidget.setCurrentIndex(2)
       

if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    w = MainWindow()
    w.resize(800, 400)
    w.show()
    sys.exit(app.exec())
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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

boy.jpg

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