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('右键被单击')
  • 相关阅读:
    BZOJ 3205 [Apio2013]机器人 ——斯坦纳树
    BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
    HDU 1423 Greatest Common Increasing Subsequence ——动态规划
    BZOJ 3309 DZY Loves Math ——莫比乌斯反演
    POJ 1038 Bugs Integrated, Inc. ——状压DP
    POJ 3693 Maximum repetition substring ——后缀数组
    POJ 2699 The Maximum Number of Strong Kings ——网络流
    POJ 2396 Budget ——有上下界的网络流
    BZOJ 4650 [Noi2016]优秀的拆分 ——后缀数组
    源码安装python
  • 原文地址:https://www.cnblogs.com/yinsedeyinse/p/11674946.html
Copyright © 2011-2022 走看看