PyQt中是依靠信号——槽的机制来运行,可是有些时候需要我们定义一下些新的信号以满足使用要求,例如按钮是没有右击的效果,那我们怎么创建一个新的信号呢?

首先要注意,新的信号是要以类属性的形式来定义

class BTN(QPushButton):
rightClicked = pyqtSignal() #类属性,建立新信号
def __init__(self,*args,**kargs):
super().__init__(*args,**kargs)

如果想要在信号中传递参数,就在定义信号的时候定义好参数的数据类型,比如我们想在点击右键的时候发送字符串‘右键被单击’

class BTN(QPushButton):
rightClicked = pyqtSignal(str) #类属性,建立新信号
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs) def mousePressEvent(self, evt):
super().mousePressEvent(evt) #非常重要,要先继承否则就成重构方法了
if evt.button() == 2: #鼠标右键对应button映射值为2
self.rightClicked.emit('右键被单击') #发射信号并传递参数

一定要注意在重构事件的时候先继承,否则就成完全重构了。如果把继承这一行注释掉以后,鼠标左键单击就没有事件了。

注意这里用了个很重要的方法

sign.emit()   #发送信号

有些信号使用时会被重载,传递的参数可以是不同类型的,使用时候需要选择信号数据类型,这时候要这样定义

class BTN(QPushButton):
rightClicked = pyqtSignal([str],[int]) #类属性,建立新信号,指定参数类型
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs) def mousePressEvent(self, evt):
super().mousePressEvent(evt) #非常重要,要先继承否则就成重构方法了
if evt.button() == 2: #鼠标右键对应button映射值为2
self.rightClicked[int].emit(123) #发射信号并传递参数
self.rightClicked[str].emit('右键被单击')

调用的时候就可以指名数据类型了

btn.rightClicked[str].connect(lambda val:print(val))#实例化后调用

还有一种情况是同时传递多个参数(带多个参数的时候也可以包含上面那种情况)

class BTN(QPushButton):
rightClicked = pyqtSignal([str],[int,list]) #类属性,建立新信号,指定参数类型
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs) def mousePressEvent(self, evt):
super().mousePressEvent(evt) #非常重要,要先继承否则就成重构方法了
if evt.button() == 2: #鼠标右键对应button映射值为2
self.rightClicked[int,list].emit(123,[1,2,3,4,5]) #发射信号时传递多个参数
self.rightClicked[str].emit('右键被单击')

GUI学习之n——自定义信号的更多相关文章

  1. PyQt学习随笔:自定义信号连接时报AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例 ...

  2. PyQt(Python+Qt)学习随笔:自定义信号在emit发射信号时报错:AttributeError: object has no attribute

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例 ...

  3. Qt 学习之路 2(5):自定义信号槽

    Home / Qt 学习之路 2 / Qt 学习之路 2(5):自定义信号槽 Qt 学习之路 2(5):自定义信号槽  豆子  2012年8月24日  Qt 学习之路 2  131条评论 上一节我们详 ...

  4. 第15.19节 PyQt(Python+Qt)入门学习:自定义信号与槽连接

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 本文利用中介绍了PyQt中的信号和槽机制,除了使用PyQt组件的已有信号外,PyQt和Qt ...

  5. Qt学习笔记-了解信号与槽-自定义信号-自定义槽

    信号与槽是连接不同控件直接的渠道. 这里以Horizontal Slider和Dial两个控件举例. 目的是在改变滑条的数值时,Dial也随之响应. 首先添加两个控件. 然后按快捷键F4进入控件编辑模 ...

  6. Django学习之缓存和信号

    Django学习之缓存和信号   一 缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views ...

  7. Qt之自定义信号和槽函数

    自定义信号和槽函数: 1.类的声明和实现分别放在.h和.cpp文件中: 2.类声明包含Q_OBJECT宏: 3.信号只要声明不要设计其的实现函数 4.发射信号用emit关键字 5.自定义槽的实现与普通 ...

  8. [转载]SharePoint 2013搜索学习笔记之自定义结果源

    搜索中心新建好之后在搜索结果页上会默认有所有内容,人员,对话,视频这四个结果分类,每个分类会返回指定范围的搜索结果,这里我再添加了部门日志结果分类,搜索这个分类只会返回部门日志内容类型的搜索结果,要实 ...

  9. shell学习总结之自定义函数

    shell学习总结之自定义函数 Myfun (){ echo -n "now i is $i " ! [ "$i" ] && exit ; ec ...

随机推荐

  1. Base table or view not found

    项目 代码分细致 改为Logic, Model, Controller ,View  四个模块 $model=D("Index",'Logic'); $res=$model-> ...

  2. ppapi,npapi

    PPAPI也就是Pepper Plugin API,是在原有网景NPAPI(Netscape Plugin API)基础上发展而来的.NPAPI是当今最流行的插件架构,几乎所有浏览器都支持,不过存在很 ...

  3. Centos 7 Redmine 安装,粘贴图片插件安装

    转自: https://blog.csdn.net/jctian000/article/details/80591878 Redmine 是一个开源的.基于Web的项目管理和缺陷跟踪工具.它用日历和甘 ...

  4. Array Stack Implement using C

  5. C语言:结构体中(.)和(->)的区别

    https://blog.csdn.net/faihung/article/details/79190039 这虽然是个小问题,但有时候很容易让人迷惑,因为有的时候用混淆了,程序编译不通过. 下面说说 ...

  6. python语言优势

    与Java等语言比较起来,最大优点是语法很简洁,很多功能像octave和matlab,能够对数组或矩阵进行高效处理. 比如一个数组求和,这里只要一句话sum(a),Java等语言就需要循环.还有矩阵的 ...

  7. 异步 map 和模块打包

    概述 本文是我在查资料的时候学到的一些东西,记录下来,供以后开发时参考,相信对其他人也有用. 参考资料: 异步函数 - 提高 Promise 的易用性 深入 CommonJs 与 ES6 Module ...

  8. 初识Nginx及其LNMP搭建

    Nginx介绍 nginx www服务软件 俄罗斯人开发 开源 性能很高 web产品 大小780k c语言开发 本身是一款静态www软件,不能解析php jsp .do 最大特点 静态小文件(1m), ...

  9. 【MM系列】SAP MM模块-查看移动平均价的历史记录

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-查看移动平均价的历 ...

  10. 获取win10壁纸

    执行命令会将所有壁纸拷贝到桌面上的wallpaper文件夹内 bat xcopy %LOCALAPPDATA%\Packages\Microsoft.Windows.ContentDeliveryMa ...