PyQT之信号槽

什么是信号槽?

  信号(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'


资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
### PyQt5 中信号与的使用方法 #### 1. 基本概念 PyQt5 的核心机制之一是信号 (signal) 和 (slot),它们用于对象之间的通信。当某个事件发生时,会触发一个信号;而这个信号可以绑定到一个或多个函数上,从而执行相应的逻辑。 #### 2. 创建和使用信号与 以下是创建和使用信号与的基本流程: ##### (1)导入必要的模块 为了使用信号与功能,需要从 `PyQt5.QtCore` 导入 `pyqtSignal` 类型,并继承自 `QObject` 或其类[^1]。 ```python from PyQt5.QtCore import pyqtSignal, QObject ``` ##### (2)定义信号 可以通过在类中声明变量的方式定义信号。例如,在一个自定义类中定义一个无参信号: ```python class MyObject(QObject): my_signal = pyqtSignal() ``` 如果需要传递参数,则可以在括号中指定参数类型: ```python my_signal_with_param = pyqtSignal(str, int) ``` ##### (3)发射信号 通过调用 `.emit()` 方法来发射信号。对于带参数的信号,需传入对应的参数值: ```python def emit_signal(self): self.my_signal.emit() # 发射无参信号 self.my_signal_with_param.emit("Hello", 42) # 发射带参信号 ``` ##### (4)连接函数 将信号连接至函数,以便在信号被触发时自动调用该函数。函数既可以是一个普通的 Python 函数,也可以是另一个类的方法[^4]。 ```python @staticmethod def handle_my_signal(): print("Signal received!") obj = MyObject() obj.my_signal.connect(handle_my_signal) # 连接信号与 obj.emit_signal() # 触发信号并打印 "Signal received!" ``` #### 3. 实际案例分析 以下展示了一个完整的例,演示如何在一个窗口程序中设置按钮点击事件以及处理自定义信号: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton from PyQt5.QtCore import pyqtSignal class CustomWidget(QWidget): custom_signal = pyqtSignal() def __init__(self): super().__init__() self.init_ui() def init_ui(self): button = QPushButton('Click Me!', self) button.clicked.connect(self.on_button_click) def on_button_click(self): print("Button clicked!") self.custom_signal.emit() if __name__ == '__main__': app = QApplication(sys.argv) widget = CustomWidget() widget.custom_signal.connect(lambda: print("Custom signal emitted!")) widget.show() sys.exit(app.exec_()) ``` 此代码片段展示了如何定义、发射和接收自定义信号的过程[^4]。 #### 4. 高级特性 除了基本的功能外,PyQt5 支持更复杂的场景,比如带有默认参数的信号、断开已有的连接等操作[^3]。 - 断开信号连接: 可以通过 `.disconnect()` 方法解除特定信号与之间的关系。 - 装饰器方式绑定: 使用装饰器简化语法结构,使代码更加清晰易读。 ```python class MyClass(QObject): sig = pyqtSignal(int) @pyqtSlot(int) def on_sig_emitted(self, value): print(f"Value received: {value}") # Example usage omitted for brevity. ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值