当前位置: 首页 > news >正文

PyQt5创建多个子窗口并监控其状态

在PyQt5中,要实现点击按钮在主界面中弹出多个独立窗口,并监控这些窗口的状态(如是否被关闭),可以使用QMainWindow作为主窗口,并使用QDialog或QMainWindow(根据你的需求,如果子窗口也需要菜单等复杂功能,则使用QMainWindow)作为子窗口。每个子窗口可以通过信号将状态变化回传给主窗口。

以下是一个简单的示例,演示了如何实现这一功能:

主窗口类 (MainWindow):包含一个按钮,点击按钮会弹出新的子窗口。
子窗口类 (ChildWindow):继承自QDialog(或QMainWindow),包含关闭信号,当窗口关闭时发送信号。
在主窗口中监控子窗口的关闭:通过连接子窗口的关闭信号到主窗口的槽函数。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QDialog, QVBoxLayout, QLabel
from PyQt5.QtCore import pyqtSignal, QEventclass ChildWindow(QDialog):closedSignal = pyqtSignal()def __init__(self, parent=None):super(ChildWindow, self).__init__(parent)self.setWindowTitle("Child Window")layout = QVBoxLayout()label = QLabel("This is a child window.", self)layout.addWidget(label)self.setLayout(layout)def closeEvent(self, event: QEvent):# 在窗口关闭前发射信号self.closedSignal.emit()# 调用基类的closeEvent来实际关闭窗口super(ChildWindow, self).closeEvent(event)class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Main Window")# 布局和按钮self.button = QPushButton("Open Child Window", self)self.button.clicked.connect(self.open_child_window)self.setCentralWidget(self.button)# 用于存储子窗口的列表self.child_windows = []def open_child_window(self):child = ChildWindow(self)child.closedSignal.connect(self.on_child_closed)child.show()self.child_windows.append(child)def on_child_closed(self):# 找出被关闭的子窗口并从列表中移除for child in self.child_windows[:]:if not child.isVisible():self.child_windows.remove(child)print(f"Child window closed.")if __name__ == "__main__":app = QApplication(sys.argv)mainWin = MainWindow()mainWin.show()sys.exit(app.exec_())

在这个修正后的代码中,ChildWindow 类重写了 closeEvent 方法,该方法在窗口关闭时会被调用。在这个方法中,我们首先发射了 closedSignal 信号,然后调用了基类 QDialogcloseEvent 方法来实际关闭窗口。

现在,每当一个子窗口关闭时,MainWindowon_child_closed 方法就会被调用,并且相应的子窗口会从 self.child_windows 列表中移除。注意,这里我们仍然通过检查窗口的 isVisible() 方法来确定窗口是否已经被关闭,因为即使窗口已经关闭了,它的实例仍然存在于内存中,直到被垃圾回收。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 代码随想录算法day19 | 回溯算法part01 | 77. 组合,216.组合总和III,17.电话号码的字母组合
  • 【pdf文件生成】如何将盖章的文件生成PDF文件
  • 营运管理系统应用架构设计
  • 霸王餐返利APP的技术架构与业务模型分析
  • NSIS - 创建桌面应用程序(Client-Side, CS 或者称为本地应用程序)的安装包
  • C#实现多选下拉框
  • 关于一些搜索的longchain实践
  • 20240820飞凌的OK3588-C的核心板在Linux R4下使用poweroff关机
  • usb无线网卡转typec口
  • [数据集][目标检测]夜间老鼠检测数据集VOC+YOLO格式316张1类别+视频文件1个
  • 省市区三级联动数据+PHP接口
  • 【C++备忘录】
  • 贪心+构造,CF 1592F1 - Alice and Recoloring 1
  • 每日一题-贪心算法
  • Vue状态管理工具:Pinia
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [case10]使用RSQL实现端到端的动态查询
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • happypack两次报错的问题
  • PhantomJS 安装
  • react 代码优化(一) ——事件处理
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 从0到1:PostCSS 插件开发最佳实践
  • 构建工具 - 收藏集 - 掘金
  • 坑!为什么View.startAnimation不起作用?
  • 聊聊flink的BlobWriter
  • 使用putty远程连接linux
  • 使用权重正则化较少模型过拟合
  • 一个JAVA程序员成长之路分享
  • 译米田引理
  • 正则与JS中的正则
  • ionic异常记录
  • 我们雇佣了一只大猴子...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​2021半年盘点,不想你错过的重磅新书
  • #define、const、typedef的差别
  • #QT(智能家居界面-界面切换)
  • $jQuery 重写Alert样式方法
  • (10)ATF MMU转换表
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)视频码率,帧率和分辨率的联系与区别
  • .Net MVC + EF搭建学生管理系统
  • .Net OpenCVSharp生成灰度图和二值图
  • .net 生成二级域名
  • .Net7 环境安装配置
  • .net通过类组装数据转换为json并且传递给对方接口
  • [ Algorithm ] N次方算法 N Square 动态规划解决