信号与槽的详解

2023-11-05

以前也写过这方面的知识,但是因为都是参照着别人的文章来写的,就是很虚,很浮夸,今天下午我又好好看了一下这方面的知识,查阅了一些资料,现在来写写我自己的发现。


接下来分为四大小点。

一、

信号和槽的基本认识

当对象的内部状态发生改变,信号就被发射。信号发射之后,它所连接的槽会被立即执行,就像一个普通函数调用一样。大部分窗口部件都预置了一些信号和槽,不同的部件信号和槽也不同。比如QPushButton的信号就有clicked,而QSpinBox的信号是valueChanged(int)/valueChanged(double)。我们也可以自定义自己感兴趣的信号和槽,也能自己发射信号。

---------------------------------------

     信号和槽有什么作用呢?

---------------------------------------

信号和槽用于对象之间的通讯,当一个窗口部件发生了变化,利用信号-槽机制,我们就能在另一个窗口或者本窗口上做出相应的动作。比如按下Button按钮,我们就能弹出一个窗口或者输出某个东西。这些动作是我们想要在按下Button按钮后想得到的。

---------------------------------------

         信号和槽的基本规则

---------------------------------------

信号和槽可以使用任何数量、任何类型的参数。

一个信号的签名必须与它的接收槽的签名相匹配。(实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名。)注:签名可以简单理解为参数

一个信号可以和多个槽连接在一起,一个槽也可以由多个信号连接,信号也可以连接信号


二、

连接信号和槽的基本函数

一般我们会用connect函数对信号和槽进行连接。这里我就详细地讲一下如何用这个函数,以及相应的几种方式。

①bool QObject.connect (QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType = Qt.AutoConnection)

1当这个连接成功时,返回True,否则返回False

The function returns true if it successfully connects the signal to the slot. It will return false if it cannot create the connection, for example, ifQObject is unable to verify the existence of eithersignal ormethod, or if their signatures aren't compatible.

当不能识别出该QObject是否带有该信号或槽时,则会connect失败。

2.参照该链接代码链接self.connect(exit,QtCore.SIGNAL('triggered()'),QtCore.SLOT('close()'))   来自链接内第15行

该句就是应用上面的语法。这一种语法是针对槽被SLOT宏包裹的类型的

为什么链接里的第15行代码好像和语法有一点不一样呢?严格说来是要在QtCore.SLOT前面加上self的,由于前面的QObject是引用的self,故这里可以省略self,如果前面的QObject不是self的话,就必须加上self了。

该句也可以写成这样:QDialog.connect(exit,QtCore.SIGNAL('triggered()'),self,QtCore.SLOT('close()'))    注:QDialog也可以换成QWidget等一些其他QObject的子类


②bool QObject.connect (QObject, SIGNAL(), callable, Qt.ConnectionType = Qt.AutoConnection)

1.该句等同于connect(sender,signal,this,method,type).

2.callable相当于函数调用,该函数可以是本类里面的函数,也可以是一个类外的普通函数。


三、如何自定义信号和槽并发射

自定义信号可以利用PyQt4.QtCore.pyqtSignal函数。

1.定义无参数的信号

from PyQt4.QtGui import *
from PyQt4.QtCore import *
class MySignal(QtGui.QPushButton):
	clicked = pyqtSignal()

2.定义有参数的信号
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class MySignal(QPushButton):
	clicked = pyqtSignal(int)

3.发射自定义信号(先自定义信号)
import  sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class MySignal(QDialog):
    Myclicked = pyqtSignal()
    def __init__(self,parent=None):
        super(MySignal,self).__init__(parent)
        button = QPushButton("click me",self)
        self.connect(button, SIGNAL("clicked()"), self.Myclicked.emit)
        self.connect(self, SIGNAL("Myclicked()"),showMsg)
def showMsg():
    print 1
app = QApplication(sys.argv)
signal=MySignal()
signal.show()
app.exec_()
通过emit函数我们就可以把自定义的Myclicked信号发射出去,并将Myclicked信号与showMsg函数连接在一起。

4.另外一种发射自定义信号方式。(不用先自定义信号)
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class MySignal(QPushButton):
	button=QPushButton("click me")
	self.connect(button ,SIGNAL("clicked()"),self.emitMyclicked)
	self.connect(self,SIGNAL("Myclicked()",showMsg)
 
	def emitMyclicked(self):
 		self.emit(SIGNAL("Myclicked()"))
	def showMsg():
 		print 1


5.发射带参数的自定义信号(不能效仿第三种方法是因为connect的时候槽函数不能带具体的参数名)
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class MySignal(QPushButton):
 	button=QPushButton("click me")
	Myclicked = pyqtSignal(int) #该句必须放在Init函数外
	self.id=2
	self.connect(button ,SIGNAL("clicked()"),self.emitMyclicked)
	self.connect(self,SIGNAL("Myclicked(int)",showMsg)
 
	def emitMyclicked(self):
		self.Myclicked.emit(self.id)
	def showMsg(a):
		print a
 
6.另外一种发射带参数的自定义信号方式(同样不用自定义信号)
class MySignal(QPushButton):


	button=QPushButton("click me")
	self.id=2
	self.connect(button ,SIGNAL("clicked()"),self.emitMyclicked)
	self.connect(self,SIGNAL("Myclicked(int)",showMsg)
	
	def emitMyclicked(self):
		self.emit(SIGNAL("Myclicked(int)"),self.id)
def showMsg(a):
	print a

7.自定义槽
利用@pyqtSlot()
#coding=utf-8
import  sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class MySignal(QDialog):

    def __init__(self,parent=None):
        super(MySignal,self).__init__(parent)
        self.id=2
        button = QPushButton("click me",self)
        self.connect(button, SIGNAL("clicked()"),SLOT("onclicked()"))

    @pyqtSlot()
    def onclicked(self):
        QMessageBox.information(self,u"提示","are you sure to quit??")
app = QApplication(sys.argv)
signal=MySignal()
signal.show()
app.exec_()
   
   
四、多个按钮连在一个槽上,当槽发生调用时如何识别出是哪个按钮的调用 在一个槽的内部,我们可以通过调用sender()发现到底调用信号是来自哪个QObject对象。 具体例子见链接
欢迎评论~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

信号与槽的详解 的相关文章

  • android手机相册多张上传,一键批量上传手机照片到QQ相册功能 节省手机流量

    十一双假期刚刚结束 无论回家还是出游 不管是家里的庭院小景还是一路上的美景扑面 你一定会拿起手机不断按下快门 记录每一个美的瞬间 如今长假归来 我们都希望能够马上和好友一起分享假期的美景趣事 可是 手机中照片数量太多 如何才能实现快速又便捷
  • Nuget配置修改-globalPackagesFolder(默认包存放位置)

    环境 nuget windows2010 nuget默认的全局包下载地址一般为 C Users username nuget packages 项目多了之后 nuget下载的包就回慢慢的变多 导致c盘被大量占用 这时候我们想要将nuget的
  • (三-3)机器学习中调参的基本思想+随机森林+实例(共3小节,文章代码即文章中所有的代码)

    通过画学习曲线 或者网格搜索 我们能够探索到调参边缘 代价可能是训练一次模型要跑三天三夜 但是在现实中 高手调参恐怕还是多依赖于经验 而这些经验 来源于 1 非常正确的调参思路和方法 2 对模型评估指 标的理解 3 对数据的感觉和经验 4
  • HEVC 编解码资源

    资料 overview 等 csvt系列详见HHI主页 适合 入门 Encoder Description 适合入门 Recommendation H 265 pdf 2016 12 22 标准文档 适合 提高 解码 High Effici
  • 订单管理系统功能

    订单管理系统的工作流程是首先对客户的订单信息进行接收 然后对订单进行处理 及时掌握交易动态 在有突发状况发生时及时反馈 订单管理系统是物理管理系统中不可缺少的一部分 商淘云跟您分享一般的订单管理系统有哪些功能 1 业务流程管理 包括订单管理
  • 程序员屌丝逆袭之路不是炒股

    最近这一段时间 你身边是不是大多数人都在谈论股票 那就对了 无论走到哪都能听到 今天又绿了 我的股票跌停了 冲上5000点啦 等等之类的话 我还不是一个股民 一直都不是 因为不懂 不敢入市 因为有人跳楼 害怕入市 最主要的原因是 因为手里没
  • 3.30 OrCAD中原理图文件怎么进行DRC检测?

    笔者电子信息专业硕士毕业 获得过多次电子设计大赛 大学生智能车 数学建模国奖 现就职于南京某半导体芯片公司 从事硬件研发 电路设计研究 对于学电子的小伙伴 深知入门的不易 特开次博客交流分享经验 共同互勉 全套资料领取扫描文末二维码 温馨提
  • 如何判断用户是否已关注公众号

    一 微信公众平台配置 1 获取appid appsecret 添加白名单 登录微信公众平台 进入基本配置 开发中需要用到两个参数 appId和appSecret appSecret只展示一次 需保存下来 否则需要重置获取 获取access
  • 以太坊day(4)

    以太坊day 4 一 遇见的错误 1 1 Error Invalid JSON RPC response 二 goland上进行合约的开发 2 1 需要的源 2 2 合约文件 2 3 编译合约 2 4 部署合约 2 5 获取合约实例 2 6
  • AIGC的1000+篇文章总结

    AIGC的1000 篇文章总结 本文收集和总结了有关AIGC的1000 篇文章 由于篇幅有限只能总结近期的内容 想了解更多内容可以访问 http www ai2news com 其分享了有关AI的论文 文章 图书 query AIGC AI
  • vue中的函数式组件

    用过react的同学都知道 函数式组件在react中的应用是很流行的 那如何在vue中使用函数式组件呢 什么是函数式组件 熟悉react的同学应该都知道 react中的函数式组件其实就是一个接收一些prop的函数 然后返回HTML vue的
  • Active Directory配置与应用

    Active Directory 配置与应用
  • 菜鸟学习nodejs--回调函数

    什么是回调函数 如果大家使用过JQuery 那么会掉函数就像家常便饭一样 例如我们经常会给一个事件传一个function的参数 其实这就是回调函数 回调函数就是我们所说的异步 如果还是有点蒙 那么我们来举个例子 我们新建一个index1 h
  • 基于混沌系统和DNA算法的RGB图像加密(Matlab代码实现)

    目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 1 概述 本文介绍了基于混沌系统和DNA编码的彩色数字图像加密 解密 抗噪声性能分析以及抗裁剪性能分析 2 运行结果 3 参考文献 1 李红凯 基于混沌理论和DNA序列编码的
  • Qt之点击QLineEdit显示软键盘

    点击QLineEdit显示软键盘 在嵌入式开发时 不能通过鼠标键盘输入是很常见的 这时候就需要通过软件层 实现软键盘和输入法来满足用户需求 一般来说 软键盘的显示通常和QLineEdit的点击事件挂钩 而QLineEdit与QPushBut
  • opencv之透视变换

    透视变换 Perspective Transformation 是将图片投影到一个新的视平面 Viewing Plane 也称作投影映射 Projective Mapping 原理 通用的变换公式为 u v是原始图片左边 对应得到变换后的图
  • VUE嵌套路由导致父组件重复渲染BUG(虚惊一场)

    哲神最近在做VUE开发 开发一个模块需要用到嵌套路由 路由如下 path dashboard component gt import views dashboard index name dashboard meta title 数据看板
  • 详解域名和DNS

    目录 一 概念名词 1 域名 1 1域名 1 2二级域名和多级域名 1 3域名对于我们有什么用呢 2 DNS Domain Name System 域名系统 2 1 什么是域名系统 3 CDN Content Delivery Networ

随机推荐

  • golang操作MySQL的具体案例

    golang操作MySQL的具体案例 代码篇的基础操作 package main import fmt github com go sql driver mysql github com jmoiron sqlx type Profile
  • 云服务器只能显示控制台吗,云服务器控制台使用方法

    云服务器控制台使用方法 内容精选 换一换 用户在购买弹性云服务器时会选择弹性云服务器的规格及登录方式 如果选择密钥对登录方式 需要选择已有密钥对或创建新的密钥对 如果没有可用的密钥对 请在控制台创建新的密钥对进行使用 在云服务器控制台左侧导
  • Pytorch(GPU)配环境原理:cuda+cudnn+pytorch配环境的每一步到底干了些什么?

    作者 18届cyl 时间 2022 5 11 参考文章 https blog csdn net qq 42406643 article details 109545766 最近帮舍友配pytorch cuda cudnn环境的时候 回想起来
  • 《剑指offer》 java版本 牛客网全AC

    1 二维数组中的查找 public class Solution public boolean Find int target int array if array length 0 array 0 length 0 return fals
  • C# 利用反射实现消息转发处理

    C 利用反射实现消息转发处理 一 C 反射 二 代码 三 总结 一 C 反射 利用C 反射的特点 我们可以实现函数名来动态调用函数 通过拼接字符串达到消息处理的效果 配合xml可以实现流程可配置化 二 代码 以下是一个简单的示例 using
  • 我正在建造一座大教堂

    有个人经过一个建筑工地 问那里的石匠们在干什么 三个石匠有三个不同的回答 第一个石匠回答 我在做养家糊口的事 混口饭吃 第二个石匠回答 我在做整个国家最出色的石匠工作 第三个石匠回答 我正在建造一座大教堂 赵日磊点评 三个石匠的回答给出了三
  • axios的get、post请求params、data传参总结

    文章原文https www jianshu com p 7a24b5eed364 分类 get请求 params 基础类型接受 名字对应即可 method const params id 123456789 name 张三 test par
  • QMessageBox 设置中文按钮(返回值判断)

    QMessageBox 设置中文按钮 返回值判断 一 解决乱码 pragma execution character set UTF 8 二 按钮修改为中文 方法一 创建一个question弹出对话框 添加两个按钮 Yes和No QMess
  • C语言:指针和数组(看完拿捏指针和数组)

    目录 数组名的理解 一维数组 解析 字符数组 解析 解析 字符串数组 解析 解析 一级指针 解析 解析 二维数组 解析 指针笔试题 题一 一维数组 题二 结构体指针 题三 一维数组 题四 二维数组 题五 二维数组 题六 二维数组 题七 指针
  • python3中argparse模块详解

    python标准库sys模块 sys模块 用于提供对Python解释器相关的操作 sys argv 命令行参数List 第一个元素是程序本身路径 sys exit n 退出程序 正常退出时exit 0 sys version 获取Pytho
  • 【FFmpeg】 音视频编码详细流程

    目录 一 视频编码流程 二 FFmpeg编码流程 三 FFmpeg编码函数 四 FFmpeg编码的数据结构 五 FFmpeg数据结构简介 六 FFmpeg数据结构分析 七 编码视频数据 八 相关函数介绍 九 编码 代码具体实现 一 视频编码
  • SOTA model / SOTA result / SOTA模型究竟是什么?

    最近看机器学习 人工智能相关顶级会议的论文 看到了 SOTA 模型 本来以为是一个很厉害的模型 但是网上完全查不到 今天会心一击 终于想到 SOTA 是 state of the art 的缩写 SOTA model state of th
  • ModbusTcp和ModbusRtu

    ModbusTcp和ModbusRtu 自己实现的modbusTCP主从站和RTU主从站 纯C语言实现 未调用第三方库 工程下载链接 modbusTcp主从站和RTU主从站 1 何为Modbus通信协议 1 1 Modbus基本介绍 Mod
  • Proteus元件库元件名称及中英对照

    Proteus元件库元件名称及中英对照 AND 与门 ANTENNA 天线 BATTERY 直流电源 BELL 铃 钟 BVC 同轴电缆接插件 BRIDEG 1 整流桥 二极管 BRIDEG 2 整流桥 集成块 BUFFER 缓冲器 BUZ
  • 油猴脚本怎么那么难找教程?

    号称好用 一个sleep我翻了全网一个小时 function use strict function go 定义函数 document querySelector video playbackRate 16 window setTimeou
  • Unity3D集成腾讯语音GVoice SDK

    简述 我们项目中用到了实时语音功能 在最初语音 SDK 技术选型的时候测试过融云 声网和腾讯的 GVoice 融云和声网我都在我们项目中使用过 但是效果都不如王者荣耀游戏中的实时语音效果 这两天好好研究了一下腾讯的 GVoice 终于成功集
  • 永恒之蓝漏洞利用及攻击

    一 基础知识介绍 1 何为永恒之蓝 永恒之蓝 Eternal Blue 爆发于2017年4月14日晚 是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限 以此来控制被入侵的计算机 甚至于2017年5月12日 不法分子通过改造
  • 如何从github拉取代码(入门篇)

    一 安装 Git Git 可以在多种操作系统上使用 包括 Windows macOS 和 Linux 以下是在 Windows 上安装 Git 的步骤 访问 Git 的官方网站 https git scm com downloads 在网站
  • POJ - 3253 Fence Repair(哈夫曼树,优先队列)

    题目 Farmer John wants to repair a small length of the fence around the pasture He measures the fence and finds that he ne
  • 信号与槽的详解

    以前也写过这方面的知识 但是因为都是参照着别人的文章来写的 就是很虚 很浮夸 今天下午我又好好看了一下这方面的知识 查阅了一些资料 现在来写写我自己的发现 接下来分为四大小点 一 信号和槽的基本认识 当对象的内部状态发生改变 信号就被发射