PyQT信号槽_学习笔记 (Signals/Slots)

   PyQT4.5版本以后可以采用新的信号与槽方式。

1、信号定义

通过类成员变量定义信号对象,如:

[python]  view plain copy
  1. class MyWidget(QWidget):  
  2.     Signal_NoParameters = PyQt4.QtCore.pyqtSignal()                                  # 无参数信号  
  3.     Signal_OneParameter = PyQt4.QtCore.pyqtSignal(int)                               # 一个参数(整数)的信号  
  4.     Signal_OneParameter_Overload = PyQt4.QtCore.pyqtSignal([int],[str])              # 一个参数(整数或者字符串)重载版本的信号  
  5.     Signal_TwoParameters = PyQt4.QtCore.pyqtSignal(int,str)                          # 二个参数(整数,字符串)的信号  
  6.     Signal_TwoParameters_Overload = PyQt4.QtCore.pyqtSignal([int,int],[int,str])     # 二个参数([整数,整数]或者[整数,字符串])重载版本的信号  

2、信号焕发

通过pyqtSignal对象的emit方法焕发事件,如:

[python]  view plain copy
  1. class MyWidget(QWidget):  
  2.     ...  
  3.     def mousePressEvent(self, event):  
  4.         self.Signal_NoParameters.emit()                                              # 焕发无参数信号  
  5.         self.Signal_OneParameter(1)                                                  # 焕发一个参数(整数)的信号  
  6.         self.Signal_OneParameter_Overload(1)                                         # 焕发一个参数(整数)重载版本的信号  
  7.         self.Signal_OneParameter_Overload("abc")                                     # 焕发一个参数(字符串)重载版本的信号  
  8.         self.Signal_TwoParameters (1,"abc")                                          # 焕发二个参数(整数,字符串)的信号  
  9.         self.Signal_TwoParameters_Overload(1,2)                                      # 焕发二个参数(整数,整数)重载版本的信号  
  10.         self.Signal_TwoParameters_Overload(1,"abc")                                  # 焕发二个参数(整数,字符串)重载版本的信号  

3、槽函数定义

通过@PyQt4.QtCore.pyqtSlot装饰方法定义槽函数,如:

[python]  view plain copy
  1. class MyWidget(QWidget):  
  2.     ...  
  3.     @PyQt4.QtCore.pyqtSlot()  
  4.     def setValue_NoParameters(self):   
  5.         '''''无参数槽方法'''  
  6.         pass  
  7.     @PyQt4.QtCore.pyqtSlot(int)  
  8.     def setValue_OneParameter(self,nIndex):   
  9.        '''''一个参数(整数)槽方法'''  
  10.         pass  
  11.     @PyQt4.QtCore.pyqtSlot(str)  
  12.     def setValue_OneParameter_String(self,szIndex):   
  13.        '''''一个参数(字符串)的槽方法'''  
  14.         pass  
  15.     @PyQt4.QtCore.pyqtSlot(int,int)  
  16.     def setValue_TwoParameters(self,x,y):   
  17.        '''''二个参数(整数,整数)槽方法'''  
  18.         pass  
  19.     @PyQt4.QtCore.pyqtSlot(int,str)  
  20.     def setValue_TwoParameters_String(self,x,szY):   
  21.        '''''二个参数(整数,字符串)槽方法'''  
  22.         pass  

4、信号连接

通过pyqtSignal的connect方法连接信号和槽方法或者可调用对象,如:

[python]  view plain copy
  1. app = QApplication(sys.argv)   
  2. widget = MyWidget()   
  3. widget.show()   
  4. widget.Signal_NoParameters.connect(self.setValue_NoParameters,Qt.QueuedConnection)                                          # 连接无参数信号  
  5. widget.Signal_OneParameter.connect(self.setValue_OneParameter,Qt.QueuedConnection)                                          # 连接一个参数(整数)信号  
  6. widget.Signal_OneParameter_Overload[int].connect(self.setValue_OneParameter,Qt.QueuedConnection)                            # 连接一个参数(整数)重载版本信号  
  7. widget.Signal_OneParameter_Overload[str].connect(self.setValue_OneParameter_String,Qt.QueuedConnection)                     # 连接一个参数(整数)重载版本信号  
  8. widget.Signal_TwoParameters.connect(self.setValue_TwoParameters,Qt.QueuedConnection)                                        # 连接二个参数(整数)信号  
  9. widget.Signal_TwoParameters_Overload[int,int].connect(self.setValue_TwoParameters,Qt.QueuedConnection)                      # 连接二个参数(整数,整数)重载版本信号  
  10. widget.Signal_TwoParameters_Overload[int,str].connect(self.setValue_TwoParameters_String,Qt.QueuedConnection)               # 连接二个参数(整数,字符串)重载版本信号  
sys.exit(app.exec_())5、实例
[python]  view plain copy
  1. # coding=gbk  
  2.   
  3. import sys  
  4. from PyQt4.QtCore import *  
  5. from PyQt4.QtGui import *  
  6.   
  7. class MyWidget(QWidget):  
  8.     OnClicked = pyqtSignal([int,int],[int,str])  
  9.     def __init__(self, parent=None):  
  10.       super(MyWidget,self).__init__(parent)  
  11.     def mousePressEvent(self, event):  
  12.       if event.button() == Qt.LeftButton:  
  13.         self.OnClicked.emit(event.x(),event.y())  
  14.         event.accept()  
  15.       elif event.button() == Qt.RightButton:  
  16.         self.OnClicked[int,str].emit(event.x(),str(event.y()))  
  17.         event.accept()  
  18.       else:  
  19.         super(MyWidget,self).mousePressEvent(self, event)  
  20.   
  21. def OnValueChanged_int(x,y):  
  22.   print("左键(%d,%d)" % (x,y))  
  23.   
  24. def OnValueChanged_string(szX,szY):  
  25.   print('右键(' + str(szX) + ',' + szY + ')')  
  26.         
  27. app = QApplication(sys.argv)   
  28. widget = MyWidget()   
  29. widget.show()   
  30. widget.OnClicked.connect(OnValueChanged_int,Qt.QueuedConnection)  
  31. widget.OnClicked[int,str].connect(OnValueChanged_string,Qt.QueuedConnection)  
  32. sys.exit(app.exec_())  

2011年8月24日 胡乐秋 长沙




你可能感兴趣的:(PyQT信号槽_学习笔记 (Signals/Slots))