简体   繁体   中英

pyqt5 closing a child window from a parent window

I have created 2 windows, win1 and win2 , using qt designer and have added two buttons: btn_open_win2 to open win2 from win1 and btn_close to close win2 .

When I run win2 directly the close method works correctly but when I run win1 and call win2 from it, the close button on win2 doesn't operate correctly.

I know that the problem arises from the point that win2 has been defined inside the if __name__ =='__main__' part as shown in the below codes but I can't solve this problem.

win1:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow

class Ui_Win1(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("Win1")
        MainWindow.resize(640, 480)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btn_open_win2 = QtWidgets.QPushButton(self.centralwidget)
        self.btn_open_win2.setGeometry(QtCore.QRect(250, 170, 131, 101))
        self.btn_open_win2.setObjectName("btn_open_win2")
        self.btn_open_win2.clicked.connect(self.on_open_win2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Win1"))
        self.btn_open_win2.setText(_translate("MainWindow", "open win2"))

    def on_open_win2(self):
        from win2 import Ui_Win2
        self.win = QMainWindow()
        self.ui = Ui_Win2()
        self.ui.setupUi(self.win)
        self.win.show()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    win1 = QMainWindow()
    ui = Ui_Win1()
    ui.setupUi(win1)
    win1.show()
    sys.exit(app.exec_())

win2:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow

class Ui_Win2(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("Win2")
        MainWindow.resize(640, 480)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btn_close = QtWidgets.QPushButton(self.centralwidget)
        self.btn_close.setGeometry(QtCore.QRect(260, 180, 131, 101))
        self.btn_close.setObjectName("btn_close")
        self.btn_close.clicked.connect(self.on_close)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Win2"))
        self.btn_close.setText(_translate("MainWindow", "close"))

    def on_close(self):
        # win2 = QMainWindow()
        # ui = Ui_Win2()
        # ui.setupUi(win2)
        win2.close()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    win2 = QMainWindow()
    ui = Ui_Win2()
    ui.setupUi(win2)
    win2.show()
    sys.exit(app.exec_())

change win2 like this:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow

class Ui_Win2(object):
    def setupUi(self, MainWindow):
        self.MainWindow = MainWindow
        MainWindow.setObjectName("Win2")
        MainWindow.resize(640, 480)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btn_close = QtWidgets.QPushButton(self.centralwidget)
        self.btn_close.setGeometry(QtCore.QRect(260, 180, 131, 101))
        self.btn_close.setObjectName("btn_close")
        self.btn_close.clicked.connect(self.on_close)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Win2"))
        self.btn_close.setText(_translate("MainWindow", "close"))

    def on_close(self):
        # win2 = QMainWindow()
        # ui = Ui_Win2()
        # ui.setupUi(win2)
        self.MainWindow.close()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    win2 = QMainWindow()
    ui = Ui_Win2()
    ui.setupUi(win2)
    win2.show()
    sys.exit(app.exec_())

call close function from self.MainWindow instead of self . and set self.MainWindow in first line of setupUi function

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM