来源: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_()
相关推荐
New to P-H Signal Processing Series (Alan Oppenheim, Series Ed) this text covers the principles and applications of "multidimensional" and "image" digital signal processing. For Sr/grad level courses ...
New to P-H Signal Processing Series (Alan Oppenheim, Series Ed) this text covers the principles and applications of "multidimensional" and "image" digital signal processing. For Sr/grad level courses ...
Two-dimensional signal and image processing by JAE S. LIM PRENTICE HALL PTR, Upper Saddle River, New Jersey 07458 page 694
总之,《时间-频率信号分析与处理》不仅提供了丰富的理论知识,还结合实际案例和工具,为学习者提供了全面的时频分析学习资源。通过对书中内容的深入学习和实践,读者将能掌握如何在不同领域中应用时频分析技术,...
Two Dimension Signal and image processing MIT Textbook part 2
1. 书籍信息:文件提及的标题为《Discrete-Time Signal Processing, 3rd Edition》,作者是Alan V. Oppenheim,来自麻省理工学院,以及Ronald W. Schafer,来自惠普实验室。这本书的出版社是Pearson Education,包含...
"03_SignalAndSlot.ZIP"中的内容很可能是关于如何在主窗口(MainWindow)与子窗口(ChildWindow)之间利用信号和槽进行交互的实例教程。下面我们将深入探讨这一主题。 信号(Signal)是QT框架中的一种特殊函数,它...
10. **信号槽的替代**:除了传统的信号槽,Qt还提供了`Qt Signal-Slot Connect Syntax`(如`&`和`|`操作符)和`Qt lambdas`作为更现代的连接方式。 如果要深入学习这部分内容,你应该解压这个压缩包,查看其中的...
signal-slot机制是QT的核心,也是QT解决线程之间通信的一大亮点。深刻理解其两大特性: (1)loosely coupled sender 与 receiver 互不关心,一个signal可以被多个slot获取,signal可以触发另一个signal (2)type-...
Deep Learning for Signal Processing with MATLAB。Deep learning networks have been used for image classification for many years, but they are powerful tools for signal data as well. A deep learning ...
混合信号集成电路测试与测量是微电子领域的一个重要分支,该领域的书籍《An Introduction to Mixed-Signal IC Test and Measurement》(混合信号IC测试与测量简介)作为学习IC测试的经典教材,提供了深入浅出的理论...
本项目“signalandslot.rar”包含了作者在学习如何自定义信号和槽、处理信号与槽重载以及利用lambda表达式进行信号连接时编写的代码示例,非常适合初学者和进阶者学习QT编程的这一重要部分。 首先,让我们详细了解...
1. Discrete-time (DT) signal and system 2. LTI system 3. DT Fourier transform B. Z轉換 1. Z-transform 2. Region of convergence 3. Inverse Z-transform C. 取樣分析 1. Periodic sampling 2. Signal ...
Discrete-Time Signal Processing 3e Oppenheim ; 7-zip merging (1) (2) (3)
使用MATLAB实现信号处理的深度学习,中文白皮书 本白皮书将回顾一些深度学习基础知识,然后会讲解三个信号处理示例: • 语音命令识别 • 剩余使用寿命 (RUL) 预估 • 信号去噪 这些示例将向您展示如何通过 MATLAB®...
QT 中的 SIGNAL 和 SLOT 在 Qt 编程中,SIGNAL 和 SLOT 是一个非常重要的机制,可以在对象之间彼此并不了解的情况下将它们的行为联系起来。这两个概念非常重要,理解它们的原理可以让 Qt 编程变得更加轻松。 ...
本压缩包"SignalandSlot.zip"的内容显然是关于Qt中的核心特性——信号与槽机制的一个示例。这个机制是Qt事件处理系统的核心,使得对象间的通信变得简单和可靠。 信号与槽机制是Qt库中的一个创新设计,它允许对象...
在Qt库中,Signal与Slot是其核心特性之一,它们是Qt事件驱动模型的重要组成部分,用于实现对象间的通信。理解并熟练使用Signal和Slot机制对于编写高效、可维护的Qt应用至关重要。 Qt的Signal(信号)是当某个事件...
Solution-Manual-for-Discrete-Time-Signal-Processing,-3-E-3rd-Edition-Alan-V.-Oppenheim,-Ronald-W.-Schafer
信号与系统教学课件:1-1 Signal measuring and expression.ppt