python - pyqt5 从父窗口关闭子窗口
问题描述
我创建了 2 个窗口,win1
并且,使用 qt 设计器win2
并添加了两个按钮:btn_open_win2
打开win2
和关闭。win1
btn_close
win2
当我win2
直接运行该方法时,该close
方法可以正常工作,但是当我从中运行win1
并调用 win2 时,close
按钮上的按钮win2
无法正常运行。
我知道问题出在部分内部已定义 win2 的点,if __name__ =='__main__'
如下面的代码所示,但我无法解决此问题。
赢1:
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_())
赢2:
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_())
解决方案
像这样改变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调用 close 函数。并在setupUi函数的第一行设置self.MainWindow
推荐阅读
- python - 这个 for 循环是否在做我认为它正在做的事情?计算连续的 1 和 -1
- azure-data-factory - 向 ADF 文本文件输出添加换行符(这可以通过逻辑应用程序或映射数据流来完成)吗?
- size - 大小点 R 图使用分类器的问题
- java - 如何在加载 json 数据或对象并开始新活动时显示加载屏幕?
- swift - 如何在@completion 函数中使用输入
- javascript - 使用带有 Spring 后端的 Node
- python - 我如何在函数中输入数据,因为它不起作用?
- python - 如何在python中连续绘制3个图
- python - 如何获得鼠标和键盘的移动?- Python
- sql - 如何在新列中获取列的值(行)