天天看点

PyQt5 多窗口应用中遇到的问题解决(父窗口与子窗口)

问题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()方法关闭子窗口。