вызов функции при закрытии окна PyQt5
Нужно вызвать функцию при закрытие второго окна. Но она вызывается когда закрывается 1-ое окно. Как это исправить?
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_first1(object):
def setupUi(self, first1):
first1.setObjectName("first1")
first1.resize(380, 249)
self.label = QtWidgets.QLabel(first1)
self.label.setGeometry(QtCore.QRect(160, 80, 191, 71))
self.label.setObjectName("label")
self.retranslateUi(first1)
QtCore.QMetaObject.connectSlotsByName(first1)
def retranslateUi(self, first1):
_translate = QtCore.QCoreApplication.translate
first1.setWindowTitle(_translate("first1", "Form"))
self.label.setText(_translate("first1", "first windows"))
class Ui_second2(object):
def setupUi(self, second2):
second2.setObjectName("second2")
second2.resize(394, 300)
self.label = QtWidgets.QLabel(second2)
self.label.setGeometry(QtCore.QRect(50, 120, 191, 71))
self.label.setObjectName("label")
app.aboutToQuit.connect(self.closeEvent) # as I understand its bind close button
self.retranslateUi(second2)
QtCore.QMetaObject.connectSlotsByName(second2)
def retranslateUi(self, second2):
_translate = QtCore.QCoreApplication.translate
second2.setWindowTitle(_translate("second2", "Form"))
self.label.setText(_translate("second2", "second windows"))
# need print text when user close second windows, but print when close firs windows
def closeEvent(self):
print("close")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
first1 = QtWidgets.QWidget()
second2 = QtWidgets.QWidget()
ui = Ui_first1()
ui.setupUi(first1)
first1.show()
ui1 = Ui_second2()
ui1.setupUi(second2)
second2.show()
sys.exit(app.exec_())
Ответы (1 шт):
[signal] void QCoreApplication::aboutToQuit()
Этот сигнал излучается, когда приложение собирается выйти из основного цикла событий, например когда уровень цикла событий упадет до нуля. Это может произойти либо после вызова quit() изнутри приложения, либо когда пользователь завершит весь сеанс рабочего стола.
Этот сигнал особенно полезен, если вашему приложению требуется очистка в последнюю секунду. Обратите внимание, что в этом состоянии взаимодействие с пользователем невозможно.
Примечание: это частный сигнал. Он может использоваться в сигнальных соединениях, но не может быть передан пользователем.
Мне показалось,что в вашем приложении использовать сигнал QCoreApplication::aboutToQuit()
как бы незачем. Как вариант:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_first1(object):
def setupUi(self, first1):
first1.setObjectName("first1")
first1.resize(580, 449)
self.label = QtWidgets.QLabel(first1)
self.label.setGeometry(QtCore.QRect(160, 40, 191, 71))
self.label.setObjectName("label")
self.retranslateUi(first1)
QtCore.QMetaObject.connectSlotsByName(first1)
def retranslateUi(self, first1):
_translate = QtCore.QCoreApplication.translate
first1.setWindowTitle(_translate("first1", "Form"))
self.label.setText(_translate("first1", "first windows"))
class Ui_second2(object):
def setupUi(self, second2):
second2.setObjectName("second2")
second2.resize(294, 200)
self.label = QtWidgets.QLabel(second2)
self.label.setGeometry(QtCore.QRect(50, 120, 191, 71))
self.label.setObjectName("label")
# app.aboutToQuit.connect(self.closeEvent) # as I understand its bind close button
self.retranslateUi(second2)
QtCore.QMetaObject.connectSlotsByName(second2)
def retranslateUi(self, second2):
_translate = QtCore.QCoreApplication.translate
second2.setWindowTitle(_translate("second2", "Form"))
self.label.setText(_translate("second2", "second windows"))
class SecondWindow(QtWidgets.QWidget, Ui_second2):
def __init__(self, parent=None):
super(SecondWindow, self).__init__(parent, QtCore.Qt.Window)
self.setupUi(self)
self.parent = parent
def closeEvent(self, event):
print("close SecondWindow и вызвать функцию ")
self.parent.my_func("Hello World")
class FirstWindow(QtWidgets.QWidget, Ui_first1):
def __init__(self):
super().__init__()
self.setupUi(self)
self.second = SecondWindow(self)
self.second.show()
def closeEvent(self, event):
print("close FirstWindow ")
def my_func(self, text):
print(text)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = FirstWindow()
w.show()
sys.exit(app.exec_())
