【QT】信号与槽

news2024/11/18 6:04:19

信号与槽

信号(Signal)槽(Slot) 是Qt中对象之间的通信方式,可以用一个简单的栗子说明:当我们想要开灯时,按下开关发出指令,这就是信号;而灯泡接收到电流变化,发出光亮,这就是响应(槽)。

我们也可以换个称呼方式:

  • 信号:触发事件
  • 槽:响应函数

所有继承自QObject的类,都可以包含信号和槽。当对象的状态发生改变时,就会发出信号。当然,他并不关心是否有人接收到这个信号。

槽函数就是用来接收对象的一个方法或是接口,就跟信号发出去并不知道有没有槽接收一样,槽也不知道有没有信号来调动他,他只是个固有属性。

信号和槽之间的关系是开放多元的,你可以看见一个信号连接到好几个槽,也可以见到一个槽上有好几个信号。更诡异的是,甚至可以将一个信号插到另一个信号上。

Qt小组件有许多预定义的信号和槽,例如QAbstractButton有一个Clicked()的信号,QLineEdit有一个clear()的槽。一般通过信号的connect()方法,将信号与槽联系起来。例如:

button=QToolButton()
line_edit=QLineEdit()
button.clicked.connect(line_edit.clear)

connect()将会翻译一个QMetaObject对象,该对象可以与disconnect()方法使用,以断开连接。

当然,除了预设的函数外,信号也可以连接到自由函数:

import sys
from PySide6.QtWidgets import QApplication,QPushButton

def function():
    print("The 'function' has been called")

app=QApplication()
button=QPushButton("Call function")
button.clicked.connect(function)
button.show()
sys.exit(app.exec())

信号类

信号类需要是QtCore.Signal()类的变量,一般我们定义信号,是在类方法的上面进行:

class Button(QWidget):
	clicked=Signal(Qt.MouseButton)

然后,我们就可以设置信号的发出:emit

def mousePressEvent(self.event):
	self.clicked.emit(event.button())

完整代码如下,这个Button将返回按下的鼠标按键类型。

class Button(QWidget):

    clicked=Signal(Qt.MouseButton)

    def __init__(self):
        super(Button, self).__init__()
        # 绑定信号与槽
        self.clicked.connect(self.PrintE)

    @Slot()
    def PrintE(self,arg):
        print(arg)

    def mousePressEvent(self,event):
        # 鼠标移动时,作为触发器发出信号
        self.clicked.emit(event.button())

App=QApplication()
button=Button()
button.show()
sys.exit(App.exec())

在这里插入图片描述

Signal的构造函数可以接收一个元组或者一个Python类型或是C类型的列表:

signal1 = Signal(int)  # Python types
signal2 = Signal(QUrl)  # Qt Types
signal3 = Signal(int, str, int)  # more than one type
signal4 = Signal((float,), (QDate,))  # optional types

除此之外,它还可以接收定义信号名称的命名参数名。如果没有传递任何信息,则新信号将与赋值给它的变量具有相同的名称。

# TODO
signal5 = Signal(int, name='rangeChanged')
# ...
rangeChanged.emit(...)

Signal还带有可选参数,比如sumResult=Signal(int,arguments=['sum'])


槽类

QObject派生类中的slot应该由装饰器@QtCore.Slot()表示。同样,要定义Signal,只需传递类似QtCore.Signal()类的类型。

@Slot(str)
def slot_function(self, s):
    ...

Slot()也接受名称和结果关键字。result关键字定义了将返回的类型,可以是C或Python类型。name关键字的行为与Signal()中的相同。如果没有传递任何名称,则新插槽将具有与正在装饰的函数相同的名称。


重载信号与槽

我们举个简单的栗子,来使用信号与槽。

import sys
from PySide6.QtWidgets import QApplication,QPushButton
from PySide6.QtCore import QObject,Signal,Slot

class Communicate(QObject):
    # 创建两个新的信号,一个用于处理整数类型,一个处理字符串类型
    speak=Signal((int,),(str,))

    def __init__(self,parent=None):
        super(Communicate, self).__init__()
        # 将 信号1 连接到 槽函数
        self.speak[int].connect(self.say_something)
        # 将 信号2 连接到 槽函数
        self.speak[str].connect(self.say_something)

    # 定义一个新的槽函数,将会接收一个整形或者一个字符串
    # 并且打印他们的名字
    @Slot(int)
    @Slot(str)
    def say_something(self,arg):
        if isinstance(arg,int):
            print("This is a number: ",arg)
        elif isinstance(arg,str):
            print("This is a String: ",arg)

if __name__ == '__main__':
    app=QApplication(sys.argv)
    someone=Communicate()

    # 发送带有不同参数的'speak'信号
    # 当然,如果想要发射`str`类型的信号,必须指定,否则是以默认`int`类型进行的
    someone.speak.emit(10)
    someone.speak[str].emit("Hello everybody")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过cmd指令创建vue项目

通过cmd指令创建vue项目 基础材料: 已安装node.js 已安装 npm(安装node.js后会自带安装npm) 首先通过node –v和npm –v确保他们都安装了,能够看见版本号就表示ok 然后通过指令安装vue脚手架 npm install -g vue/cli5.0.8 安…

QTableView表格控件区域选择-自绘选择区域

一、概述 最近优化了一个小功能,主要是模仿excel相关的操作,觉得还挺不错的,因此在这里进行了整理,分享给有需要的朋友。今天主要是说一下区域选择这项功能,Qt自带的表格控件是具有区域选择功能的,但是他并…

【Linux技术专题系列】「必备基础知识」一起探索(su、sudo等相关身份提权/身份切换机制)

内容简介 Linux技术专题,主要介绍相关,针对于Linux开发和知识体系的必备开发技能以及基础常识,是开发者必备的知识体系和方法论。 什么是用户、用户组 Linux用户 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资…

如何制作mp3音频文件?分享制作mp3的简单方法

MP3 对每个人来说都不是一个陌生的名字,因为它是全球排名第一的主流音乐格式。听过上千首MP3歌曲,你知道自己可以制作MP3文件吗?如果答案是否定的,那么您很幸运能找到这篇文章,因为它将通过向您介绍一个免费且简单的解…

产险精算GLM案例2

这是北美产险精算学会CAS网站上的一个案例,对案例略作修改后进行验证。 原始数据是一个简单的分组数据: ClassAOITerrExposureClaims1Low1762Medium1108443High11791054Low2130625Medium2126826High21291207Low3143848Medium31261019High34046 &#x…

从入门到项目实战 - Vue 列表渲染

Vue 列表渲染上一节:《Vue 条件渲染 》| 下一节:《Vue 数据的单向和双向绑定 》jcLee95 邮箱 :291148484163.com CSDN 主页:https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 本文地址:https://blog.c…

【Linux技术专题系列】「必备基础知识」一起探索(用户、用户组与文件权限)

内容简介 Linux技术专题,主要介绍相关,针对于Linux开发和知识体系的必备开发技能以及基础常识,是开发者必备的知识体系和方法论。 什么是用户、用户组 Linux用户 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资…

【OpenFeign】【源码+图解】【五】创建FeignClient接口的代理(上)

【OpenFeign】【源码图解】【四】FeignClient实例工具类ReflectiveFeign 目录6. 创建FeignClient接口的代理6.1 收集方法的元数据6.1.1 方法上基础信息6.1.2 方法所在类的注解信息6.1.3 方法上的注解信息6.1.3.1 uri6.1.3.2 produces6.1.3.3 consumes6.1.3.4 headersRequestMap…

认识 TEE OS

了解 TEE OS 关于本文,是一篇会议纪要,会议主题是《从 Linux Kernel 角度看 TEE》,主讲人是周贺贺。它适用于嵌入式系统开发/驱动开发/内核设计/安全业务设计从业者,目的是让自己掌握 TEE 基本概念,知道大系统软件架构…

目标检测之YOLOv1算法分析

网络结构 卷积层池化层全连接层 输入448∗448448*448448∗448大小的图片 输出7∗7∗307*7*307∗7∗30的张量 30维张量包括20个对象的概率,2个bounding box的置信度及其位置(一个bounding box位置信息需要四个值,两个bounding box总需要8个…

【C/C++】排序讲解,C语言实现各种排序

这篇文章会从思路到实现到分析时间空间复杂度,一次性搞懂各种排序 有帮助的话点个赞收藏一下不迷路啊 如果对时间空间复杂度还不熟悉的请去看 时间 空间复杂度 本文章不会讲堆排序,这部分内容会马上单写一篇博客介绍,和堆的和一些更复杂的问题…

C++基础之核心3

C核心编程 本阶段主要针对C面向对象编程技术做详细讲解,探讨C中的核心和精髓。 1 内存分区模型 C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量…

海格里斯HEGERLS标准解析|夹抱式四向穿梭车医用行业现代物流解决方案

众所周知,随着当前电商、医用、新零售等领域的快速发展,各大中小企业对于存储的要求越来越高,为让仓储货架、仓储设备、仓储配件等更具有行业的适配性,传统固定的穿梭车已不能满足对不同尺寸料箱的处理。为此,河北沃克…

二叉树题型

目录 二叉数遍历迭代法 1.1前序遍历 1.2中序遍历 1.3后续遍历 二叉树最小深度 二叉树所有路径 中序后序构造二叉树 验证二叉搜素树 二叉数遍历迭代法 1.1前序遍历 前序遍历顺序:根—左—右; 解法1:用栈来进行中间过程处理&#xf…

Babel和devServer | Webpack

文章目录Babel和devServerbabelbabel命令行使用babel-loaderVue源码的打包VSCode对SFC文件的支持vue-loaderdevServerBabel和devServer babel babel命令行使用 babel-loader Vue源码的打包 VSCode对SFC文件的支持 vue-loader devServer

一键可以轻松替换人物背景图,效果出乎意料的好(附 Python 代码)

最近发现 BackgroundMattingV2 项目的一些使用上的小缺陷,但是他却可以做到头发丝精细的抠图效果。我将项目稍微魔改了一下,让他在可以选择单一图片的基础上,可以把抠好的图片贴在自定义的背景图上,这样就可以让照片中的人物&…

使用Tomcat时出现Access Error: 404 -- Not Found的解决办法

当时出现这种情况很迷惑,错误提示如下 突然想到大二上学模电的时候安装过multisim,这个软件的某些不必要的服务占用了8080端口(恼),出现这种情况应该是和Tomcat默认的端口冲突了。 于是就有了解决思路: …

stm32f407VET6 系统学习 day03 通用同步异步收发器

1.同步串行通信 同步通信发送端和接收端必须用共同的时钟源才能保持它们之间的准确同步。同步传输时,每个字 符没有起始位和停止位,它不是用起始位来标志字符的开始,而是用一串特定的二进制序列,称为 同步字符,去通知接…

[思维模式-14]:《复盘》-2- “知”篇 - 复盘之道

目录 前言: 一、U型学习法:复盘的学习机理 (1) 回顾、评估 (2)分析、反思 (3)萃取、提炼 (4)转化、应用 二、复盘与PDCA既有区别,也有联系…

solr 安装和使用

Solr是基于ApacheLucene构建的流行、快速、开源的企业搜索平台 Solr具有高度可靠性、可扩展性和容错性,提供分布式索引、复制和负载平衡查询、自动故障切换和恢复、集中配置等功能。Solr为许多世界上最大的互联网站点提供搜索和导航功能 环境准备 linux centos7 ja…