PyQT之信号槽
来源:互联网 发布:qq飞车cdkey软件 编辑:程序博客网 时间:2024/05/29 08:29
什么是信号槽?
信号(singal)与槽(slot)用于对象相互通信,信号:当某个对象的某个事件发生时,触发一个信号,槽:响应指定信号的所做的反应,其实信号槽类似于.NET里面的委托、事件,比如Repeater控件类,当行数据绑定后,触发一个ItemDataBound事件,不管使用者使用会监听该事件并做额外处理,其控件类内部都会触发该事件,这种机制很多程度提高了类的封装性和完整性。
PyQt的窗体控件类已经有很多的内置信号,开发者也可以添加自己的自定义信号,信号槽有如下特点:
- 一个信号可以连接到许多插槽。
- 一个信号也可以连接到另一个信号。
- 信号参数可以是任何Python类型。
- 一个插槽可以连接到许多信号。
- 连接可能会直接(即同步)或排队(即异步)。
- 连接可能会跨线程。
- 信号可能会断开
内置信号槽、自定义信号槽的使用:
- 内置信号槽的使用
槽的参数个数可以小于等于信号的参数个数,所以这里按钮btn的内置信号clicked虽然有一个参数,但是sinTest槽参数可以为空。
# -*- coding: utf-8 -*-from PyQt4.QtGui import *from PyQt4.QtCore import *def sinTest(): btn.setText("按钮文本改变") app = QApplication([])main = QWidget()main.resize(200,100)btn = QPushButton("按钮文本",main)##按钮btn的内置信号连接名为sinTest的槽btn.clicked.connect(sinTest)main.show()app.exec_()
- 自定义信号槽的使用
# -*- coding: utf-8 -*-from PyQt4.QtGui import *from PyQt4.QtCore import *class SinClass(QObject): ##定义一个无参数的信号 sin1 = pyqtSignal() ##声明带一个int类型参数的信号 sin2 = pyqtSignal(int) ##声明带一个int和str类型参数的信号 sin3 = pyqtSignal(int,str) ##声明带一个列表类型参数的信号 sin4 = pyqtSignal(list) ##声明带一个字典类型参数的信号 sin5 = pyqtSignal(dict) ##声明一个多重载版本的信号,包括了一个带int和str类型参数的信号,以及带str参数的信号 sin6 = pyqtSignal([int,str], [str]) def __init__(self,parent=None): super(SinClass,self).__init__(parent) ##信号连接到指定槽 self.sin1.connect(self.sin1Call) self.sin2.connect(self.sin2Call) self.sin3.connect(self.sin3Call) self.sin4.connect(self.sin4Call) self.sin5.connect(self.sin5Call) self.sin6[int,str].connect(self.sin6Call) self.sin6[str].connect(self.sin6OverLoad) ##信号发射 self.sin1.emit() self.sin2.emit(1) self.sin3.emit(1,"text") self.sin4.emit([1,2,3,4]) self.sin5.emit({"name":"codeio","age":"25"}) self.sin6[int,str].emit(1,"text") self.sin6[str].emit("text") def sin1Call(self): print("sin1 emit") def sin2Call(self,val): print("sin2 emit,value:",val) def sin3Call(self,val,text): print("sin3 emit,value:",val,text) def sin4Call(self,val): print("sin4 emit,value:",val) def sin5Call(self,val): print("sin5 emit,value:",val) def sin6Call(self,val,text): print("sin6 emit,value:",val,text) def sin6OverLoad(self,val): print("sin6 overload emit,value:",val)sin = SinClass()
signal只能在QObject的子类中定义。如果在子类外直接定义,会出现 AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'emit'
0 0
- PyQT之信号槽
- 信号和槽-Pyqt
- pyqt信号与槽
- PyQt GUI--信号与槽
- pyqt自定义信号与槽
- pyqt信号和槽传递额外参数
- pyqt 信号与槽的理解
- pyqt中信号,槽的使用方法
- PyQt 信号和槽传递额外参数
- pyqt信号和槽传递额外参数
- PyQt之玩转signal(信号)与slot(槽)二:添加自定义槽
- PyQt之玩转signal(信号)与slot(槽)一:介绍及简单实例
- PyQt之玩转signal(信号)与slot(槽)一:介绍及简单实例
- pyqt+python自定义信号
- PyQT信号槽_学习笔记 (Signals/Slots)
- PyQt 的一些小总结 (信号槽,弹框)
- pyqt通过信号槽机制来退出线程
- PyQT信号槽_学习笔记 (Signals/Slots)
- 迷宫问题
- Ubuntu 12.04 解决屏幕亮度调节
- mysql5.5编码问题
- 编码规范系列(一):Eclipse Code Templates设置
- QT中的多线程编程
- PyQT之信号槽
- Android系统Camera图片反转的一个问题
- 条件随机场(CRF)
- Chipmunk2D中文手册
- mac快捷键
- 为什么Java7开始在数字中使用下划线
- ngrok 内网穿透利器
- 如何打一个既支持模拟器也支持真机的库 .a 文件
- PHP include_once 与include require_once 与 require