PyQt5信号与槽二

窗口数据传递

在开发程序时,如果这个程序只有一个窗口,则应该关心这个窗口里面的各个控件之间是如何传递数据的;如果这个程序有多个窗口,那么还应该关心不同的窗口之间是如何传递数据的。对于多窗口的情况,一般有两种解决办法,其中一种是主窗口获取子窗口中的控件的属性;另外一种是通过信号与槽机制,一般是子窗口通过发射信号的形式传递数据,主窗口的槽函数获取这些数据。

单一窗口数据传递

对于具有单一窗口的程序来说,一个控件的变化会影响另一个控件的变化,这种变化利用信号与槽机制非常容易解决。

import  sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import  Qtclass WinForm(QWidget):def __init__(self):super(WinForm, self).__init__()self.initUI()def initUI(self):# 先创建滑块和LCD控件lcd = QLCDNumber(self)slider = QSlider(Qt.Horizontal, self)vBox = QVBoxLayout()vBox.addWidget(lcd)vBox.addWidget(slider)self.setLayout(vBox)# valueChanged()是QSlider的一个信号函数,只要slider的值发生改变,它就会发射一个信号# 然后通过Connect连接信号的接收控件,也就是lcdslider.valueChanged.connect(lcd.display)self.setGeometry(300, 300, 350, 150)self.setWindowTitle("信号与槽")if __name__ == '__main__':app = QApplication(sys.argv)form = WinForm()form.show()sys.exit(app.exec_())

运行脚本,滑动滑块可以修改数值
在这里插入图片描述

多窗口数据传递:调用属性

在PyQt编程过程中,经常会遇到输入或选择多个参数的问题,把多个参数写到一个窗口中,主窗口会显得很臃肿,所以一般是添加一个按钮,调用对话框,在对话框中进行参数的选择,关闭对话框时将参数值返回给主窗口。

PyQt提供了一些标准的对话框类,用于输入数据、修改数据、更改应用的设置等,常见的有QFileDialog、QInputDialog、QColorDialog、QFontDialog等。

DateDialog.py

import  sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import  *
from PyQt5.QtGui import *class DateDialog(QDialog):def __init__(self, parent=None):super(DateDialog, self).__init__(parent)self.setWindowTitle('DateDialog')# 在布局中添加控件layout = QVBoxLayout(self)self.datetime = QDateTimeEdit(self)self.datetime.setCalendarPopup(True)self.datetime.setDateTime(QDateTime.currentDateTime())layout.addWidget(self.datetime)# 使用两个按钮(OK和Cancel)分别连接accept()和reject()槽函数buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)buttons.accepted.connect(self.accept)buttons.rejected.connect(self.reject)layout.addWidget(buttons)# 从对话框中获取当前日期和时间def dateTime(self):return self.datetime.dateTime()# 使用静态函数创建对话框并返回(date, time, accepted)@staticmethoddef getDateTime(parent=None):dialog = DateDialog(parent)result = dialog.exec_()date = dialog.dateTime()return (date.date(), date.time(), result==QDialog.Accepted)

Main.py

import  sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import  *
from PyQt5.QtGui import *
from DateDialog import DateDialogclass WinForm(QWidget):def __init__(self, parent=None):super(WinForm, self).__init__(parent)self.resize(400, 90)self.setWindowTitle('对话框关闭时返回值给主窗口')self.lineEdit = QLineEdit(self)self.button1 = QPushButton("弹出对话框1")self.button1.clicked.connect(self.onButton1Click)self.button2 = QPushButton("弹出对话框2")self.button2.clicked.connect(self.onButton2Click)gridLayout = QGridLayout()gridLayout.addWidget(self.lineEdit)gridLayout.addWidget(self.button1)gridLayout.addWidget(self.button2)self.setLayout(gridLayout)def onButton1Click(self):dialog = DateDialog(self)result = dialog.exec_()date = dialog.dateTime()self.lineEdit.setText(date.date().toString())print("\n日期对话框的返回值")print(f'date={date.date()}')print(f"time={date.time()}")print(f'result={result}')dialog.destroy()def onButton2Click(self):date, time, result = DateDialog.getDateTime()self.lineEdit.setText(date.toString())print('\n日期对话框的返回值')print(f'date={date}')print(f'time={time}')print(f"result={result}")if __name__ == '__main__':app = QApplication(sys.argv)form = WinForm()form.show()sys.exit(app.exec_())

运行脚本
在这里插入图片描述

多窗口数据传递:信号与槽

对于多窗口的数据传递,一般是通过子窗口发射信号的,主窗口通过槽函数捕获这个信号,然后获取信号里面的数据。子窗口发射的信号有两种,其中一种是发射PyQt内置id一些信号;另一种是发射自定义的信号。

发射自定义信号的好处是,它的参数类型可以自定义。比如发射一个自定义信号,它的参数类型可以为int、str、dict、list等;如果发射内置信号,则只能是特定的几个参数。

DateDialog.py

import  sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import  *
from PyQt5.QtGui import *class DateDialog(QDialog):Signal_OneParameter = pyqtSignal(str)def __init__(self, parent=None):super(DateDialog, self).__init__(parent)self.setWindowTitle("子窗口:用来发射信号")# 在布局中添加控件layout = QVBoxLayout(self)self.label = QLabel(self)self.label.setText("前者发射内置信号\n后者发射自定义信号")self.datetime_inner = QDateTimeEdit(self)self.datetime_inner.setCalendarPopup(True)self.datetime_inner.setDateTime(QDateTime.currentDateTime())self.datetime_emit = QDateTimeEdit(self)self.datetime_emit.setCalendarPopup(True)self.datetime_emit.setDateTime(QDateTime.currentDateTime())layout.addWidget(self.label)layout.addWidget(self.datetime_inner)layout.addWidget(self.datetime_emit)#  使用两个button(ok和Cancel)分别连接accept()和reject()槽函数buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal,self)buttons.accepted.connect(self.accept)buttons.rejected.connect(self.reject)layout.addWidget(buttons)self.datetime_emit.dateTimeChanged.connect(self.emit_signal)def emit_signal(self):date_str = self.datetime_emit.dateTime().toString()self.Signal_OneParameter.emit(date_str)

test.py

import  sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import  *
from PyQt5.QtGui import *
from DateDialog import DateDialogclass WinForm(QWidget):def __init__(self, parent=None):super(WinForm, self).__init__(parent)self.resize(400, 90)self.setWindowTitle('信号与槽传递参数的实例')self.open_btn = QPushButton("获取时间")self.lineEdit_inner = QLineEdit(self)self.lineEdit_emit = QLineEdit(self)self.open_btn.clicked.connect(self.openDialog)self.lineEdit_inner.setText("接收子窗口内置信号的时间")self.lineEdit_emit.setText("接收子窗口自定义信号的时间")grid = QGridLayout()grid.addWidget(self.lineEdit_inner)grid.addWidget(self.lineEdit_emit)grid.addWidget(self.open_btn)self.setLayout(grid)def openDialog(self):dialog = DateDialog(self)print(dialog)"""连接子窗口的内置信号与主窗口的槽函数"""dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot)"""连接子窗口的自定义信号与主窗口的槽函数"""dialog.Signal_OneParameter.connect(self.deal_emit_slot)dialog.show()def deal_inner_slot(self, date):self.lineEdit_inner.setText(date.toString())def deal_emit_slot(self, dateStr):self.lineEdit_emit.setText(dateStr)if __name__ == '__main__':app = QApplication(sys.argv)form = WinForm()form.show()sys.exit(app.exec_())

运行脚本
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19720.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【java】多态

一、概念 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作。 同一个事件发生在不同的对象上会产生不同的结果。 比如: public class Test {public static void main(String[] args) {Person xn…

使用Holoviews创建复杂的可视化布局

目录 一、Holoviews简介 二、安装Holoviews 三、Holoviews的基本概念 元素(Elements): 容器(Containers): 映射(Mappings): 四、基本用法 创建元素: …

Java2.1——异常

异常基本概念 一:程序出错 分类 : 编辑错误,逻辑错误,运行时错误 目的: 异常处理让程序出错了还运行,避免中止运行 二: 运行时错误 当出现编译时无法预料的问题,将运行错误报告…

2025年假期python,工作日python脚本求出 输出日期内容

# coding:utf-8 import datetime# 假设已知的节假日和调休安排 holidays [datetime.date(2025, 1, 1), # 元旦datetime.date(2025, 1, 28), # 春节datetime.date(2025, 1, 29), # 春节datetime.date(2025, 1, 30), # 春节datetime.date(2025, 1, 31), # 春节datetime.dat…

1TB! 台湾最新倾斜摄影3DTiles数据分享

之前的文章分享了546GB香港倾斜摄影3DTiles数据,主要是验证倾斜模型3DTiles转换工具的生产效率和数据显示效率,结果对比可以看出无论是数据生产速度以及成果数据显示效率上,都优于其他两种技术路线。最近使用倾斜模型3DTiles工具生产了台湾地…

ssm136公司项目管理系统设计与实现+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:公司项目管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本T公司项目管理系…

【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则

大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言1、无法链接…

小车综合玩法--2.超声波避障

一、实验准备 通过超声波模块与小车结合,实现小车超声波避障。小车接线已安装,且安装正确 二、实验原理 通过超声波我们获取小车与障碍物的距离。当检测到小车与障碍物的距离小于我们的设置的距离时,小车左旋避开障碍物。 三、实验源码 #!…

「二」体验HarmonyOS端云一体化开发模板——创建端云一体化工程

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…

操作系统启动实验

简单的操作系统 汇编代码 ; hello-os ; TAB4ORG 0x7c00 ; 指明程序装载地址; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy codeJMP entryDB 0x90DB "HELLOIPL" ; 启动扇区名称(8字节)DW 512 ; 每个扇区(s…

助力模型训练,深度学习的经典数据集介绍

想要训练出效果好的模型,高质量的数据集必不可少。深度学习的经典数据集包括MNIST手写数字数据集、Fashion MNIST数据集、CIFAR-10和CIFAR-100数据集、ILSVRC竞赛的ImageNet数据集、用于检测和分割的PASCAL VOC和COCO数据集等,本文将对这些数据集进行介绍…

Spring基础——针对实习面试

目录 Spring基础什么是Spring框架?列举一些重要的Spring模块Spring Core 核心模块Spring AOP 模块Spring MVC 模块Spring Data 模块Spring Security 模块Spring Boot 模块 Spring,Spring MVC,Spring Boot之间什么关系(区别&#x…

PH热榜 | 2024-11-17

DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 在线预览 1. Octokit 标语:人人都能用的无代码游戏和AR滤镜制作工具 介绍:Octokit 是一款无需编程技能就能使用…

分享本周所学——三维重建算法3D Gaussian Splatting(3DGS)

大家好,欢迎来到《分享本周所学》第十二期。本人是一名人工智能初学者,刚刚读完大二。前几天自学了一下3D Gaussian Splatting(3DGS),觉得非常有意思。写这篇文章主要是因为网上大部分关于3DGS的文章都比较晦涩&#x…

Python-简单病毒程序合集(一)

前言:简单又有趣的Python恶搞代码,往往能给我们枯燥无味的生活带来一点乐趣,激发我们对编程的最原始的热爱。那么话不多说,我们直接开始今天的编程之路。 编程思路:本次我们将会用到os,paltform,threading,ctypes,sys,…

技术成长战略是什么?

文章目录 技术成长战略是什么?1. 前言2. 跟技术大牛学成长战略2.1 系统性能专家案例2.2 从开源到企业案例2.3 技术媒体大V案例2.4 案例小结 3. 学习金字塔和刻意训练4. 战略思维的诞生5. 建议 技术成长战略是什么? 1. 前言 在波波的微信技术交流群里头…

哪家云电脑便宜又好用?ToDesk云电脑、顺网云、达龙云全方位评测

陈老老老板🤴 🧙‍♂️本文专栏:生活(主要讲一下自己生活相关的内容)生活就像海洋,只有意志坚强的人,才能到达彼岸。 🧙‍♂️本文简述:讲一下市面上云电脑的对比。 🧙‍♂️上一篇文…

(五)自定义组件

(五)自定义组件 1、 VS插件推荐2、开始创建自定义的组件2.1、 快速添加基础页面内容: vbase2.2、 随便写上内容 3、使用该组件3.1、具体步骤3.2、其他说明 1、 VS插件推荐 开始前,如果大家使用的是VS Code,我推荐安装Vue VSCode S…

Springboot+Vue的项目搭建(一)

一、JDK配置环境变量 1、在官网下载jdkJava Downloads | Oracle 中国 2、下载之后双击安装。 3、配置环境变量,做法:此电脑->右键->属性->高级系统设置 然后点击确定即可 点击winr java -version 检查一下是否配置成功 二、maven包管理器…

如何从微软官网下载运行库解决?微软官网教你如何获取最新运行库支持

当您在运行某些应用程序或游戏时遇到缺少运行库文件的问题,例如“unityplayer.dll文件丢失”,访问微软官方网站下载并安装最新的运行库是一个可靠且安全的解决方案。微软提供的运行库包含了多种语言环境下的库文件和支持,如Visual C Redistri…