来源:http://blog.csdn.net/hlqyq/article/details/6713828
注意,原文有些错误
1、信号定义
通过类成员变量定义信号对象,如:
class MyWidget(QWidget): Signal_NoParameters = PyQt4.QtCore.pyqtSignal() # 无参数信号 Signal_OneParameter = PyQt4.QtCore.pyqtSignal(int) # 一个参数(整数)的信号 Signal_OneParameter_Overload = PyQt4.QtCore.pyqtSignal([int],[str]) # 一个参数(整数或者字符串)重载版本的信号 Signal_TwoParameters = PyQt4.QtCore.pyqtSignal(int,str) # 二个参数(整数,字符串)的信号 Signal_TwoParameters_Overload = PyQt4.QtCore.pyqtSignal([int,int],[int,str]) # 二个参数([整数,整数]或者[整数,字符串])重载版本的信号
注意:虽然写的是str,实际发送的是QString类型
AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'emit'
不要把信号定义在__init__里面
参考:http://stackoverflow.com/questions/2970312/pyqt4-qtcore-pyqtsignal-object-has-no-attribute-connect
2、信号焕发
通过pyqtSignal对象的emit方法焕发事件,如:
class MyWidget(QWidget): ... def mousePressEvent(self, event): self.Signal_NoParameters.emit() # 焕发无参数信号 self.Signal_OneParameter.emit(1) # 焕发一个参数(整数)的信号 self.Signal_OneParameter_Overload.emit(1) # 焕发一个参数(整数)重载版本的信号 self.Signal_OneParameter_Overload[str].emit("abc") # 焕发一个参数(字符串)重载版本的信号 self.Signal_TwoParameters.emit(1,"abc") # 焕发二个参数(整数,字符串)的信号 self.Signal_TwoParameters_Overload.emit(1,2) # 焕发二个参数(整数,整数)重载版本的信号 self.Signal_TwoParameters_Overload[int,str].emit(1,"abc") # 焕发二个参数(整数,字符串)重载版本的信号
注意,如果不写[str],或调用默认的
3、槽函数定义
通过@PyQt4.QtCore.pyqtSlot装饰方法定义槽函数,如:
class MyWidget(QWidget): ... @PyQt4.QtCore.pyqtSlot() def setValue_NoParameters(self): '''''无参数槽方法''' pass @PyQt4.QtCore.pyqtSlot(int) def setValue_OneParameter(self,nIndex): '''''一个参数(整数)槽方法''' pass @PyQt4.QtCore.pyqtSlot(str) def setValue_OneParameter_String(self,szIndex): '''''一个参数(字符串)的槽方法''' pass @PyQt4.QtCore.pyqtSlot(int,int) def setValue_TwoParameters(self,x,y): '''''二个参数(整数,整数)槽方法''' pass @PyQt4.QtCore.pyqtSlot(int,str) def setValue_TwoParameters_String(self,x,szY): '''''二个参数(整数,字符串)槽方法''' pass
注意:PyQt4.QtCore.pyqtSlot 好像不是必须的,文档说有些情况需要,没完全理解。
4、信号连接
通过pyqtSignal的connect方法连接信号和槽方法或者可调用对象,如:
app = QApplication(sys.argv) widget = MyWidget() widget.show() widget.Signal_NoParameters.connect(self.setValue_NoParameters,Qt.QueuedConnection) # 连接无参数信号 widget.Signal_OneParameter.connect(self.setValue_OneParameter,Qt.QueuedConnection) # 连接一个参数(整数)信号 widget.Signal_OneParameter_Overload[int].connect(self.setValue_OneParameter,Qt.QueuedConnection) # 连接一个参数(整数)重载版本信号 widget.Signal_OneParameter_Overload[str].connect(self.setValue_OneParameter_String,Qt.QueuedConnection) # 连接一个参数(整数)重载版本信号 widget.Signal_TwoParameters.connect(self.setValue_TwoParameters,Qt.QueuedConnection) # 连接二个参数(整数)信号 widget.Signal_TwoParameters_Overload[int,int].connect(self.setValue_TwoParameters,Qt.QueuedConnection) # 连接二个参数(整数,整数)重载版本信号 widget.Signal_TwoParameters_Overload[int,str].connect(self.setValue_TwoParameters_String,Qt.QueuedConnection) # 连接二个参数(整数,字符串)重载版本信号
5、实例
# coding=gbk import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class MyWidget(QWidget): OnClicked = pyqtSignal([int,int],[int,str]) def __init__(self, parent=None): super(MyWidget,self).__init__(parent) def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.OnClicked.emit(event.x(),event.y()) event.accept() elif event.button() == Qt.RightButton: self.OnClicked[int,str].emit(event.x(),str(event.y())) event.accept() else: super(MyWidget,self).mousePressEvent(self, event) def OnValueChanged_int(x,y): print("左键(%d,%d)" % (x,y)) def OnValueChanged_string(szX,szY): print('右键(' + str(szX) + ',' + szY + ')') app = QApplication(sys.argv) widget = MyWidget() widget.show() widget.OnClicked.connect(OnValueChanged_int,Qt.QueuedConnection) widget.OnClicked[int,str].connect(OnValueChanged_string,Qt.QueuedConnection) sys.exit(app.exec_())
super(MyQObject, self).__init__() #如果写了__init__()函数,这一行一定要有,否则会出现 #TypeError: pyqtSignal must be bound to a QObject, not 'MyQObject'
完整的测试代码:
#!/usr/bin/env python #coding:utf8 __version__ = "1.0" """ 《New-style Signal and Slot Support》文档的测试程序 - sofire@gmail.com @2013.02.11 http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html 注意: 1、str和QString的关系没弄明白 2、@QtCore.pyqtSlot() 的作用不清楚 """ from PyQt4.QtCore import * from PyQt4.QtGui import * import PyQt4.QtCore as QtCore import PyQt4.QtGui as QtGui from PyQt4.QtCore import QVariant import os, sys, time def pyFunction(): print "pyFunction" def pyFunction2(i): print "pyFunction", i class TestWidget(QWidget): """ 信号的定义 注意不要定义到__init__等方面里了,否则会报错 """ Signal_NoParameters = QtCore.pyqtSignal() # 无参数信号 Signal_OneParameter = QtCore.pyqtSignal(int) # 一个参数(整数)的信号 Signal_OneParameter_Overload = QtCore.pyqtSignal([int],[str]) # 一个参数(整数或者字符串)重载版本的信号 Signal_OneParameter_Overload2 = QtCore.pyqtSignal([int],['QString']) # 一个参数(整数或者字符串)重载版本的信号 Signal_TwoParameters = QtCore.pyqtSignal(int,str) # 二个参数(整数,字符串)的信号 Signal_TwoParameters_Overload = QtCore.pyqtSignal([int,int],[int,str]) # 二个参数([整数,整数]或者[整数,字符串])重载版本的信号 def __init__(self, parent=None): super(TestWidget, self).__init__(parent) #信号连接 self.Signal_NoParameters.connect(self.setValue_NoParameters, Qt.QueuedConnection) # 连接无参数信号 self.Signal_OneParameter.connect(self.setValue_OneParameter, Qt.QueuedConnection) # 连接一个参数(整数)信号 self.Signal_OneParameter_Overload[int].connect(self.setValue_OneParameter, Qt.QueuedConnection) # 连接一个参数(整数)重载版本信号 self.Signal_OneParameter_Overload[str].connect(self.setValue_OneParameter_String, Qt.QueuedConnection) # 连接一个参数(整数)重载版本信号 self.Signal_OneParameter_Overload2[int].connect(self.setValue_OneParameter2, Qt.QueuedConnection) # 连接一个参数(整数)重载版本信号 self.Signal_OneParameter_Overload2[str].connect(self.setValue_OneParameter2, Qt.QueuedConnection) # 连接一个参数(整数)重载版本信号 self.Signal_TwoParameters.connect(self.setValue_TwoParameters, Qt.QueuedConnection) # 连接二个参数(整数)信号 self.Signal_TwoParameters_Overload[int,int].connect(self.setValue_TwoParameters, Qt.QueuedConnection) # 连接二个参数(整数,整数)重载版本信号 self.Signal_TwoParameters_Overload[int,str].connect(self.setValue_TwoParameters_String, Qt.QueuedConnection) # 连接二个参数(整数,字符串)重载版本信号 #self.runTest() """ 信号Emit """ def mousePressEvent(self, event): self.Signal_NoParameters.emit() # 焕发无参数信号 self.Signal_OneParameter.emit(1) # 焕发一个参数(整数)的信号 self.Signal_OneParameter_Overload.emit(2) # 焕发一个参数(整数)重载版本的信号 self.Signal_OneParameter_Overload[int].emit(3) # 焕发一个参数(整数)重载版本的信号 self.Signal_OneParameter_Overload[str].emit("abc") # 焕发一个参数(字符串)重载版本的信号 self.Signal_OneParameter_Overload2.emit(22) # 焕发一个参数(整数)重载版本的信号 self.Signal_OneParameter_Overload2[int].emit(33) # 焕发一个参数(整数)重载版本的信号 self.Signal_OneParameter_Overload2[str].emit("abcabc") # 焕发一个参数(字符串)重载版本的信号 self.Signal_TwoParameters.emit(1,"abc") # 焕发二个参数(整数,字符串)的信号 self.Signal_TwoParameters_Overload[int,int].emit(1,2) # 焕发二个参数(整数,整数)重载版本的信号 self.Signal_TwoParameters_Overload[int,str].emit(1,"abc") # 焕发二个参数(整数,字符串)重载版本的信号 @QtCore.pyqtSlot() def setValue_NoParameters(self): '''''无参数槽方法''' print "setValue_NoParameters" pass @QtCore.pyqtSlot(int) def setValue_OneParameter(self, nIndex): '''''一个参数(整数)槽方法''' print "setValue_OneParameter", nIndex pass @QtCore.pyqtSlot(str) def setValue_OneParameter_String(self, szIndex): '''''一个参数(字符串)的槽方法''' print "setValue_OneParameter_String", szIndex pass #@QtCore.pyqtSlot(int) @QtCore.pyqtSlot('QString') @QtCore.pyqtSlot(str) def setValue_OneParameter2(self, i): #print type(i) if isinstance(i, QtCore.QString): print 'setValue_OneParameter2 is str', i elif isinstance(i, int): print 'setValue_OneParameter2 is int', i else: print 'wrong type' @QtCore.pyqtSlot(int,int) def setValue_TwoParameters(self, x, y): '''''二个参数(整数,整数)槽方法''' print "setValue_TwoParameters", x, y pass @QtCore.pyqtSlot(int,str) def setValue_TwoParameters_String(self, x, szY): '''''二个参数(整数,字符串)槽方法''' print "setValue_TwoParameters_String", x, szY pass if __name__ == '__main__': app = QtGui.QApplication(sys.argv) widget = TestWidget() widget.show() app.exec_()
相关推荐
### Qt学习笔记知识点详解 #### 一、Qt简介与特性 **Qt** 是一款功能强大的跨平台 C++ 应用程序开发框架,不仅限于 GUI(图形用户界面)开发,还包括许多其他领域的支持,例如网络通信、数据库访问等。Qt 的核心...
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
《基于YOLOv8的智慧社区独居老人生命体征监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
Android Studio Meerkat 2024.3.1 Patch 1(android-studio-2024.3.1.14-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/90557060 part2: https://download.csdn.net/download/weixin_43800734/90557056
侧轴承杯加工工艺编制及夹具设计.zip
NASA数据集锂电池容量特征提取(Matlab完整源码和数据) 作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,主做机器学习和深度学习时序、回归、分类、聚类和降维等程序设计和案例分析,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信。
板料折弯机液压系统设计.zip
C6150车床的设计.zip
机器学习之KNN实现手写数字
python爬虫;智能切换策略,反爬检测机制
mpls-vpn-optionA-all
56tgyhujikolp[
GB 6442-86企业职工伤亡事故调查分析规则.pdf
汽车液压式主动悬架系统的设计().zip
2000-2024年各省专利侵权案件结案数数据 1、时间:2000-2024年 2、来源:国家知识产权J 3、指标:专利侵权案件结案数 4、范围:31省 5、用途:可用于衡量知识产权保护水平
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
内容概要:本文档详细复现了金融数学课程作业,涵盖欧式看涨期权定价和投资组合优化两大部分。对于欧式看涨期权定价,分别采用Black-Scholes模型和蒙特卡洛方法进行了计算,并对彩虹期权进行了基于最大值的看涨期权定价。投资组合优化部分则探讨了最小方差组合、给定收益的最小方差组合、最大效用组合以及给定风险的最大收益组合四种情形,还对比了拉格朗日乘数法和二次规划求解器两种方法。文中不仅提供了详细的MATLAB代码,还有详尽的中文解释,确保每一步骤清晰明了。 适合人群:金融工程专业学生、量化分析师、金融数学爱好者。 使用场景及目标:①帮助学生理解和掌握金融衍生品定价的基本原理和方法;②为从事量化分析的专业人士提供实用工具和技术支持;③作为教学材料辅助高校教师讲授相关内容。 其他说明:文档还包括了完整的论文结构建议,从封面页到结论,再到附录,涵盖了所有必要元素,确保提交的作业符合学术规范。此外,还特别强调了数据预处理步骤,确保代码可以顺利运行。
脉冲电解射流加工喷射装置设计(1)
ThinkPad S1 (2nd Generation) 和ThinkPad Yoga 260 用户指南V3.0,包含如何拆机更换硬件
charles描述文件下载