zoukankan      html  css  js  c++  java
  • GUI学习之n——自定义信号

    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('右键被单击')
  • 相关阅读:
    微服务化之无状态化与容器化
    微服务化的不同阶段 Kubernetes 的不同玩法
    网易大数据技术沙龙
    十年•杭研技术秀 | “网易云存储服务”从0到1发展之路
    传统业务上云:跨AZ容灾架构解析
    kubernetes1.9管中窥豹-CRD概念、使用场景及实例
    浅谈 kubernetes service 那些事 (下篇)
    浅谈 kubernetes service 那些事(上篇)
    Docker容器的原理与实践(上)
    Docker容器的原理与实践 (下)
  • 原文地址:https://www.cnblogs.com/yinsedeyinse/p/11674946.html
Copyright © 2011-2022 走看看