PyQt学习------PyQt自定义信号

使用自定义信号,需要使用PyQt6.QtCore.pyqtSignal()

信号需要定义为类属性,这样定义的信号是未绑定信号
当创建类的实例后,PyQt 会自动将类的实例与信号绑定,生成了绑定的信号
一个绑定的信号具有 connect()、disconnect()和 emit()三个函数

connect():关联槽函数

disconnect():断开与槽函数的关联

emit():发射信号

来举个例子吧

from PyQt6.QtCore import QObject
from PyQt6.QtCore import pyqtSignal
from PyQt6.QtCore import pyqtSlot

class Human(QObject):
    nameChanged = pyqtSignal(str)
    ageChanged = pyqtSignal([int], [str])
    
    def __init__(self, name='王红', age=32, parent =None):
        super().__init__(parent)
        self.setAge(age)
        self.setName(name)
    
    def setAge(self, age):
        self.__age=age
        self.ageChanged.emit(self.__age)
        if age<=18:
            ageInfo = "你是 少年"
        elif(18<age<=35):
            ageInfo="你是 年轻人"
        elif(25<age<=55):
            ageInfo="你是 中年人"
        elif(55<age<=80):
            ageInfo="您是 老人"
        else:
            ageInfo="您是 寿星啊"
        self.ageChanged[str].emit(ageInfo)
        
    def setName(self, name):
        self.__name=name
        self.nameChanged.emit(self.__name)

class Responsor(QObject):
    def do_nameChanged(self, name):
        print("Hello,"+name)
        
    @pyqtSlot(int)
    def do_ageChanged_int(self, age):
        print("你的年龄是:"+str(age))
        
    @pyqtSlot(str)
    def do_ageChanged_str(self, ageInfo):
        print(ageInfo)
        
        
if __name__=="__main__":
    print("**创建对象时**")
    star=Human("张三", 13)
    
    resp = Responsor()
    
    star.nameChanged.connect(resp.do_nameChanged)
    star.ageChanged.connect(resp.do_ageChanged_int)
    star.ageChanged[str].connect(resp.do_ageChanged_str)
    print("\n **建立连接后**")
    
    star.setName("李四")
    star.setAge(75)
    
    star.nameChanged.disconnect(resp.do_nameChanged)
    star.ageChanged[str].disconnect(resp.do_ageChanged_str)
    print("\n **断开name连接和age的str连接,age的int连接保留后**")
    star.setName("王五")
    star.setAge(35)
    
  
    

对代码的解释

建立连接后,当变量 self.__name 发生变化时发射了 nameChanged 信号,并且
传递了参数 self.__name
 def setName(self, name):
        self.__name=name
        self.nameChanged.emit(self.__name)
这个信号关联了下列槽函数
 star.nameChanged.connect(resp.do_nameChanged)
以下函数的运行产生了以上的输出
断开连接后,无法产生输出了。所以对高叶的 hello 看不到。
class Responsor(QObject):
    def do_nameChanged(self, name):
        print("Hello,"+name)

注意: overload 的信号如果都定义了槽函数,两个槽函数不能同名,连接时需要给信号加参数区分

star.ageChanged.connect(resp.do_ageChanged_int)
star.ageChanged[str].connect(resp.do_ageChanged_str)

 断开连接

 star.nameChanged.disconnect(resp.do_nameChanged)
 star.ageChanged[str].disconnect(resp.do_ageChanged_str)

输出结果

创建对象时虽然也发射信号,但还未建立关联,所以无响应
建立关联后,3 个信号的槽函数都响应了。我们看到了三行输出。
断开关联后,断开管理的槽函数无响应了。所以只有没断开的 int 类型槽函数还有输出。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要为QListWidget添加右键菜单,可以使用QMenu和QListWidget的customContextMenuRequested信号。以下是一个示例代码: ```python from PyQt5.QtWidgets import QApplication, QListWidget, QMenu, QListWidgetItem class MyListWidget(QListWidget): def __init__(self): super().__init__() self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.showContextMenu) def showContextMenu(self, pos): item = self.itemAt(pos) if item is not None: menu = QMenu("Menu", self) menu.addAction("Action 1", self.action1) menu.addAction("Action 2", self.action2) menu.exec(self.mapToGlobal(pos)) def action1(self): print("Action 1 triggered") def action2(self): print("Action 2 triggered") # Usage example if __name__ == "__main__": app = QApplication([]) widget = MyListWidget() widget.addItem("Item 1") widget.addItem("Item 2") widget.show() app.exec_() ``` 在此示例中,我们创建了一个名为MyListWidget的自定义QListWidget,它重写了setContextMenuPolicy和customContextMenuRequested方法。setContextMenuPolicy方法设置QListWidget的上下文菜单策略为CustomContextMenu,这意味着我们将使用customContextMenuRequested信号自定义上下文菜单。customContextMenuRequested方法用于显示右键菜单,它获取鼠标位置并检查其下方是否有列表项。如果有,它将创建一个QMenu对象并添加两个操作。然后,它使用mapToGlobal方法将鼠标位置转换为全局坐标,并在该位置处显示菜单。 当用户单击操作时,将分别调用action1和action2方法。这些方法可以执行任何您想要执行的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值