`
sofire
  • 浏览: 146133 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

New-style Signal and Slot 学习笔记[转]

 
阅读更多

 来源: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_()

 

 

分享到:
评论

相关推荐

    Two-Dimensional Signal and Image Processing Part 2

    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 Part 1

    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.zip

    Two-dimensional signal and image processing by JAE S. LIM PRENTICE HALL PTR, Upper Saddle River, New Jersey 07458 page 694

    Time-Frequency Signal Analysis and Processing_ A Comprehensive.rar

    总之,《时间-频率信号分析与处理》不仅提供了丰富的理论知识,还结合实际案例和工具,为学习者提供了全面的时频分析学习资源。通过对书中内容的深入学习和实践,读者将能掌握如何在不同领域中应用时频分析技术,...

    Two Dimension Signal and image processing MIT Textbook part 2

    Two Dimension Signal and image processing MIT Textbook part 2

    Discrete-Time Signal Processing, 3rd--【Oppenheim】--[1137].pdf

    1. 书籍信息:文件提及的标题为《Discrete-Time Signal Processing, 3rd Edition》,作者是Alan V. Oppenheim,来自麻省理工学院,以及Ronald W. Schafer,来自惠普实验室。这本书的出版社是Pearson Education,包含...

    03_SignalAndSlot.ZIP

    "03_SignalAndSlot.ZIP"中的内容很可能是关于如何在主窗口(MainWindow)与子窗口(ChildWindow)之间利用信号和槽进行交互的实例教程。下面我们将深入探讨这一主题。 信号(Signal)是QT框架中的一种特殊函数,它...

    07-signalSlot-2.7z

    10. **信号槽的替代**:除了传统的信号槽,Qt还提供了`Qt Signal-Slot Connect Syntax`(如`&`和`|`操作符)和`Qt lambdas`作为更现代的连接方式。 如果要深入学习这部分内容,你应该解压这个压缩包,查看其中的...

    qt signal-slot测试代码

    signal-slot机制是QT的核心,也是QT解决线程之间通信的一大亮点。深刻理解其两大特性: (1)loosely coupled sender 与 receiver 互不关心,一个signal可以被多个slot获取,signal可以触发另一个signal (2)type-...

    deep-learning-for-signal-white-paper.pdf

    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

    混合信号集成电路测试与测量是微电子领域的一个重要分支,该领域的书籍《An Introduction to Mixed-Signal IC Test and Measurement》(混合信号IC测试与测量简介)作为学习IC测试的经典教材,提供了深入浅出的理论...

    signalandslot.rar

    本项目“signalandslot.rar”包含了作者在学习如何自定义信号和槽、处理信号与槽重载以及利用lambda表达式进行信号连接时编写的代码示例,非常适合初学者和进阶者学习QT编程的这一重要部分。 首先,让我们详细了解...

    Discrete-Time Signal Processing, 3rd

    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(2)

    Discrete-Time Signal Processing 3e Oppenheim ; 7-zip merging (1) (2) (3)

    cn-deep-learning-for-signal-white-paper.pdf

    使用MATLAB实现信号处理的深度学习,中文白皮书 本白皮书将回顾一些深度学习基础知识,然后会讲解三个信号处理示例: • 语音命令识别 • 剩余使用寿命 (RUL) 预估 • 信号去噪 这些示例将向您展示如何通过 MATLAB®...

    QT中的SIGNAL和SLOT

    QT 中的 SIGNAL 和 SLOT 在 Qt 编程中,SIGNAL 和 SLOT 是一个非常重要的机制,可以在对象之间彼此并不了解的情况下将它们的行为联系起来。这两个概念非常重要,理解它们的原理可以让 Qt 编程变得更加轻松。 ...

    SignalandSlot.zip

    本压缩包"SignalandSlot.zip"的内容显然是关于Qt中的核心特性——信号与槽机制的一个示例。这个机制是Qt事件处理系统的核心,使得对象间的通信变得简单和可靠。 信号与槽机制是Qt库中的一个创新设计,它允许对象...

    Qt中的signal和slot

    在Qt库中,Signal与Slot是其核心特性之一,它们是Qt事件驱动模型的重要组成部分,用于实现对象间的通信。理解并熟练使用Signal和Slot机制对于编写高效、可维护的Qt应用至关重要。 Qt的Signal(信号)是当某个事件...

    Solution-Manual-for-Discrete-Time-Signal-Processing,-3-E-3rd-Edition

    Solution-Manual-for-Discrete-Time-Signal-Processing,-3-E-3rd-Edition-Alan-V.-Oppenheim,-Ronald-W.-Schafer

    信号与系统教学课件:1-1 Signal measuring and expression.ppt

    信号与系统教学课件:1-1 Signal measuring and expression.ppt

Global site tag (gtag.js) - Google Analytics