Завершение приложения после закрытия основного окна
Как закрыть все окна и завершить приложение после закрытия основного окна?
Проблема в том, что если будет открыто второе окно, а главное закроется приложение будет работать с открытым вторым окном.
Как это исправить?
from PyQt5 import QtCore, QtGui, QtWidgets
class Car:
color = "red"
year = 215
class Form(QtWidgets.QMainWindow):
def __init__(self, parent):
super().__init__()
self.parent = parent
self.centralwidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralwidget)
self.setStyleSheet(f"QMainWindow {{background-color: {self.parent.car.color};}}")
self.btn = QtWidgets.QPushButton('Поменять color')
self.btnMain = QtWidgets.QPushButton('Окно main')
layout = QtWidgets.QGridLayout(self.centralwidget)
layout.addWidget(self.btn, 0, 0)
layout.addWidget(self.btnMain, 1, 0)
self.add_function()
def add_function(self):
self.btn.clicked.connect(self.changeColorBlack)
self.btnMain.clicked.connect(self.openMain)
def changeColorBlack(self):
self.parent.car.color = "blue"
self.setStyleSheet(f"QMainWindow {{background-color: {self.parent.car.color};}}")
def openMain(self):
self.parent.setStyleSheet(f"QMainWindow {{background-color: {self.parent.car.color};}}")
self.parent.show()
#self.close()
# Как из этого класса обращаться к объекту volvo?
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.centralwidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralwidget)
self.btn = QtWidgets.QPushButton('Поменять color')
self.btnForm = QtWidgets.QPushButton('Окно Form')
layout = QtWidgets.QGridLayout(self.centralwidget)
layout.addWidget(self.btn, 0, 0)
layout.addWidget(self.btnForm, 1, 0)
self.car = Car()
self.setStyleSheet(f"QMainWindow {{background-color: {self.car.color};}}")
self.add_function()
def add_function(self):
self.btn.clicked.connect(self.changeColorWhite)
self.btnForm.clicked.connect(self.openForm)
def changeColorWhite(self):
#Как из этой функции обращаться к объекту volvo?
# self.volvo.color = "white"
self.car.color = "yellow"
self.setStyleSheet(f"QMainWindow {{background-color: {self.car.color};}}")
def openForm(self):
self.form = Form(self)
self.form.setWindowTitle("Hello Form.")
self.form.show()
#self.hide()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.setWindowTitle("Hello World!!")
w.show()
sys.exit(app.exec_())
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
Класс Form инициализируйте так:
...
super().__init__(parent) # <--- parent
...
from PyQt5 import QtCore, QtGui, QtWidgets
class Car:
color = "red"
year = 215
class Form(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent) # <--- parent
self.parent = parent
self.setWindowTitle("Hello Form!")
self.centralwidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralwidget)
self.setStyleSheet(f"QMainWindow {{background-color: {self.parent.car.color};}}")
self.btn = QtWidgets.QPushButton('Поменять color')
self.btnMain = QtWidgets.QPushButton('Окно main')
layout = QtWidgets.QGridLayout(self.centralwidget)
layout.addWidget(self.btn, 0, 0)
layout.addWidget(self.btnMain, 1, 0)
self.add_function()
def add_function(self):
self.btn.clicked.connect(self.changeColorBlack)
self.btnMain.clicked.connect(self.openMain)
def changeColorBlack(self):
self.parent.car.color = "blue"
self.setStyleSheet(f"QMainWindow {{background-color: {self.parent.car.color};}}")
def openMain(self):
self.parent.setStyleSheet(f"QMainWindow {{background-color: {self.parent.car.color};}}")
self.parent.show()
#self.close()
# Как из этого класса обращаться к объекту volvo?
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.centralwidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralwidget)
self.btn = QtWidgets.QPushButton('Поменять color')
self.btnForm = QtWidgets.QPushButton('Окно Form')
layout = QtWidgets.QGridLayout(self.centralwidget)
layout.addWidget(self.btn, 0, 0)
layout.addWidget(self.btnForm, 1, 0)
self.car = Car()
self.setStyleSheet(f"QMainWindow {{background-color: {self.car.color};}}")
self.add_function()
def add_function(self):
self.btn.clicked.connect(self.changeColorWhite)
self.btnForm.clicked.connect(self.openForm)
def changeColorWhite(self):
#Как из этой функции обращаться к объекту volvo?
# self.volvo.color = "white"
self.car.color = "yellow"
self.setStyleSheet(f"QMainWindow {{background-color: {self.car.color};}}")
def openForm(self):
self.form = Form(self)
self.form.setWindowTitle("Hello Form.")
self.form.show()
#self.hide()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.setWindowTitle("Hello World!!")
w.show()
sys.exit(app.exec_())
Автор решения: S. Nick
→ Ссылка
Хотя я не понимаю, что вас смущает в моем первом ответе, предложу вам другой вариант, который сделает то же самое.
Переопределите метод closeEvent:
from PyQt5 import QtCore, QtGui, QtWidgets
class Car:
color = "red"
year = 215
class Form(QtWidgets.QMainWindow):
def __init__(self, parent):
super().__init__()
self.parent = parent
self.setWindowTitle("Hello Form!")
self.centralwidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralwidget)
self.setStyleSheet(f"QMainWindow {{background-color: {self.parent.car.color};}}")
self.btn = QtWidgets.QPushButton('Поменять color')
self.btnMain = QtWidgets.QPushButton('Окно main')
layout = QtWidgets.QGridLayout(self.centralwidget)
layout.addWidget(self.btn, 0, 0)
layout.addWidget(self.btnMain, 1, 0)
self.add_function()
def add_function(self):
self.btn.clicked.connect(self.changeColorBlack)
self.btnMain.clicked.connect(self.openMain)
def changeColorBlack(self):
self.parent.car.color = "blue"
self.setStyleSheet(f"QMainWindow {{background-color: {self.parent.car.color};}}")
def openMain(self):
self.parent.setStyleSheet(f"QMainWindow {{background-color: {self.parent.car.color};}}")
self.parent.show()
#self.close()
# Как из этого класса обращаться к объекту volvo?
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.centralwidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralwidget)
self.btn = QtWidgets.QPushButton('Поменять color')
self.btnForm = QtWidgets.QPushButton('Окно Form')
layout = QtWidgets.QGridLayout(self.centralwidget)
layout.addWidget(self.btn, 0, 0)
layout.addWidget(self.btnForm, 1, 0)
self.car = Car()
self.setStyleSheet(f"QMainWindow {{background-color: {self.car.color};}}")
self.add_function()
def add_function(self):
self.btn.clicked.connect(self.changeColorWhite)
self.btnForm.clicked.connect(self.openForm)
def changeColorWhite(self):
#Как из этой функции обращаться к объекту volvo?
# self.volvo.color = "white"
self.car.color = "yellow"
self.setStyleSheet(f"QMainWindow {{background-color: {self.car.color};}}")
def openForm(self):
self.form = Form(self)
self.form.setWindowTitle("Hello Form.")
self.form.show()
#self.hide()
def closeEvent(self, event):
reply = QtWidgets.QMessageBox.question(self, 'Информация',
"Вы хотите закрыть все окна?",
QtWidgets.QMessageBox.Yes,
QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes:
self.form.close()
event.accept()
else:
event.ignore()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.setWindowTitle("Hello World!!")
w.show()
sys.exit(app.exec_())

