Как перейти в другой класс при определённых действиях в 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 шт):
Чтобы открыть новое окно, его нужно инициализировать (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() лишь запускает его отображение на экране.