【问题标题】:pyqt5 closing a child window from a parent windowpyqt5 从父窗口关闭子窗口
【发布时间】:2020-10-17 18:39:25
【问题描述】:

我创建了 2 个窗口,win1win2,使用 qt 设计器并添加了两个按钮:btn_open_win2win1 打开 win2btn_close 以关闭 win2

当我直接运行win2 时,close 方法可以正常工作,但是当我运行win1 并从中调用win2 时,win2 上的close 按钮无法正常运行。

我知道问题出在if __name__ =='__main__' 部分中定义了win2,如下面的代码所示,但我无法解决这个问题。

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_())

【问题讨论】:

    标签: python redirect pyqt5 window open-closed-principle


    【解决方案1】:

    像这样改变win2:

    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_())
    

    self.MainWindow 而不是 self 调用关闭函数。并在 setupUi 函数的第一行设置 self.MainWindow

    【讨论】:

    • 谢谢你亲爱的 Sajjad,我的问题完全解决了,最好的
    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 2023-03-07
    • 2017-02-08
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多