Как перейти в другой класс при определённых действиях в PyQt5?

У меня есть код, где создана кнопка в середине экрана, мне нужно, что бы при её нажатии открывался другой класс и закрывался старый для дальнейших действий, как это сделать? Мой код:

#                                                                                                                                                                                                                                                    
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.Qt import *
MyApp = QtWidgets.QApplication(sys.argv)
V = MyApp.desktop().screenGeometry()
h = V.height()
w = V.width()
try:
    from PyQt5.QtWinExtras import QtWin
    myappid = 'mycompany.myproduct.subproduct.version'
    QtWin.setCurrentProcessExplicitAppUserModelID(myappid)
except ImportError:
    pass
class PushButton(QPushButton):
    def __init__(self, parent=None):
        super(PushButton, self).__init__(parent)
        
        self.icon_1 = QtGui.QIcon()
        self.icon_1.addPixmap(
            QtGui.QPixmap("Button_image/start.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.setIconSize(QtCore.QSize(500, 300))
        self.setIcon(self.icon_1)
        
        self.icon_2 = QtGui.QIcon()
        self.icon_2.addPixmap(
            QtGui.QPixmap("Button_image/start_true.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.setIconSize(QtCore.QSize(500, 300))

        self.setFixedSize(350, 220)
        
    def enterEvent(self, event):  
        self.setIcon(self.icon_2)

    def leaveEvent(self, event):
        self.setIcon(self.icon_1)
class StartWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.сentralWidget = QtWidgets.QWidget(self)
        self.сentralWidget.setObjectName("сentralWidget")
        self.setCentralWidget(self.сentralWidget)
        
        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)
        #Кнопка для создания текста
        def Button_text(btn_name, text, px, resize, resize_2, move, move_2, color):
            btn_name.setMouseTracking(True);
            btn_name.setText(text)
            btn_name.setStyleSheet("color: " + color + "; border-radius: " + str(px) + "px")
            btn_name.setFont(QtGui.QFont('MS Serif', 14))
            btn_name.resize(resize, resize_2)
            btn_name.move(move, move_2)
            
        #Кнопка для создания картинки
        def Button_image(btn_name, text, px, resize, resize_2, move, move_2, color):
            btn_name.setMouseTracking(True);
            btn_name.setText(text)
            btn_name.setStyleSheet("background-image: url(" + image + "); border-radius: " + str(px) + "px")
            btn_name.setFont(QtGui.QFont('MS Serif', 14))
            btn_name.resize(resize, resize_2)
            btn_name.move(move, move_2)
        
        #Кнопка для действий
        def Button_click(btn_name, text, px, resize, resize_2, move, move_2, color, mains):
            btn_name.setMouseTracking(True)
            btn_name.setStyleSheet("background-color: " + color + "; border-radius: " + str(px) + "px")
            btn_name.setFont(QtGui.QFont('MS Serif', 14))
            btn_name.resize(resize, resize_2)
            btn_name.move(move, move_2)
            btn_name.clicked.connect(mains)
       
        self.start_btn = QPushButton(self)
        Button_click(self.start_btn, "", 50, 250, 100, int(w/2-125), int(h/2-50), "Blue", self.start)
    def start(self):
        None
#тут другой класс
class MainWindow(QMainWindow):
    #прикольчики
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    app.setWindowIcon(QtGui.QIcon('System_image/icon.png'))
    ex = StartWindow()
    ex.setWindowTitle('Story Telling')
    ex.setWindowIcon(QIcon('System_image/icon.png'))
    ex.showFullScreen()
    ex.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: Vestalt

Чтобы открыть новое окно, его нужно инициализировать (WindowClass()), положить в атрибут текущего класса (обязательно, иначе объект будет удалён сборщиком мусора) и запустить (self.window.show()).

Пример:

import sys
from PyQt5 import QtWidgets
from PyQt5.Qt import *


class StartWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle('Example')
        self.button = QPushButton('Open new window', self)
        self.button.resize(200, 200)
        self.button.move(50, 50)
        self.button.clicked.connect(self.start)

    def start(self):
        self.window = MainWindow()  # Инициализация
        self.hide()  # Скрытие текущего окна (необязательно)
        self.window.show()  # Запуск нового окна


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle('New window')


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ex = StartWindow()
    ex.show()
    sys.exit(app.exec_())

Методы .hide() и .show() работают и для других классов окон (в том числе QWidget).

На самом деле старое окно скрывать необязательно, они с новым вполне могут сосуществовать. Ровно так же нет необходимости показывать окно сразу после инициализации, объект класса окна может храниться сколь угодно долго. .show() лишь запускает его отображение на экране.

→ Ссылка