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

本文介绍了在PyQt5中处理多窗口应用时遇到的问题,包括如何避免重复打开子窗口以及如何在关闭父窗口时同时关闭子窗口。通过分析和实践,提出使用show()函数而非exec_()来创建子窗口,并在父窗口的closeEvent中调用子窗口的close()方法来实现同步关闭。参考了相关博客文章以解决这些问题。
摘要由CSDN通过智能技术生成

问题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
要将PyQt5窗口嵌入到窗口,可以按照以下步骤进行操作: 1. 在窗口的类创建一个成员变量,用于存储窗口的实例。 2. 在窗口的类初始化方法实例化窗口,并将窗口窗口置为当前的窗口。 3. 连接信号和槽,将按钮点击事件与显示窗口的函数连接起来。 4. 在显示窗口的函数,调用窗口的show()方法显示窗口。 下面是一个示例代码,演示了如何将PyQt5窗口嵌入到窗口: ```python import sys from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QDialog class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Main Window") self.setGeometry(100, 100, 300, 200) self.child_window = ChildWindow(self) # 创建窗口实例,并将窗口置为当前窗口 button = QPushButton("Open Child Window", self) button.setGeometry(100, 100, 150, 30) button.clicked.connect(self.show_child_window) # 将按钮点击事件与显示窗口的函数连接起来 def show_child_window(self): self.child_window.show() # 显示窗口 class ChildWindow(QDialog): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Child Window") self.setGeometry(200, 200, 200, 100) if __name__ == "__main__": app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_()) ``` 在这个示例,MainWindow是窗口,ChildWindow是窗口。在MainWindow的构造函数,我们实例化了ChildWindow,并将其窗口置为当前的MainWindow。然后,我们创建了一个按钮,并将其点击事件连接到show_child_window函数,该函数用于显示窗口。在show_child_window函数,我们调用窗口的show()方法来显示窗口。 这样,当点击按钮时,窗口就会嵌入到窗口显示出来。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值