问题1:通过点击Button打开新窗口后,如何实现不关闭新窗口的情况下再点击Button时不会新建窗口,而是显示先前打开的窗口?(以前用tkinter时遇到这个问题,是使用一个boolean值来做开关,如果对象已创建,就不新建,否则新建,然后关闭窗口时在控制该boolean,该方法可行但是比较麻烦)
分析:有两种方法:
1.新建窗口时使用exec_()函数(显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止,函数返回一个DialogCode结果;在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭)。
但是我需要user在通过Button打开该窗口的同时,可以对父窗口进行操作,所以不使用exec_()函数
2.使用show()函数新建窗口(显示一个非模式对话框。控制权即刻返回给调用函数。弹出窗口是否模式对话框,取决于modal属性的值。)
使用show()新建的子窗口在打开时可以操作父窗口。此处,新建窗口有两种方法:
(1)在槽函数中实例化窗口,然后.show()创建窗口:
class MyMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.pushButton_1.clicked.connect(self.openGenWin)
def closeEvent(self, event):
self.genWin.close()
event.accept()
# 在槽函数openGenWin中实例化并调用show()
def openGenWin(self):
self.genWin = MyGeneratorWindow()
self.genWin.show()
点击Button后,子窗口正常打开,重复点击按钮,子窗口重复弹出
(2)在__init__()方法中实例化窗口,在槽函数中调用show()
class MyMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.pushButton_1.clicked.connect(self.openGenWin)
# 在构造方法中实例化窗口
self.genWin = MyGeneratorWindow()
def closeEvent(self, event):
self.genWin.close()
event.accept()
# 在槽函数中调用show()
def openGenWin(self):
self.genWin.show()
重复点击Button后,子窗口不重复弹出
结果:使用方法2(2)即解决问题
该问题查阅过下列博客:
https://blog.csdn.net/chengmo123/article/details/93379470
https://blog.csdn.net/weixin_40520077/article/details/104040414
问题2:PyQt5中目前不知道在父窗口与子窗口都开启时,如何做到关闭父窗口,子窗口也同时关闭,所以用重写父窗口的closeEvent(self, event)来解决:
def closeEvent(self, event):
self.genWin.close()
event.accept()
该方法是PyQt5中点击窗口右上角“X”时触发的函数
event参数:如果调用event.ignore()方法,则会使关闭窗口失效
如果调用event.accept()方法,则会关闭窗口
结果:要实现在关闭父窗口时子窗口同时关闭,则在重写该方法时,在event.accept()之前调用close()方法关闭子窗口。