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

本文展示了如何在PyQt6中使用信号和槽函数进行对象间的通信。通过创建`Human`类,定义`nameChanged`和`ageChanged`信号,并在`Responsor`类中定义相应的槽函数。当`Human`对象的属性改变时,会发射信号并调用关联的槽函数,如`do_nameChanged`和`do_ageChanged_int`。断开信号与槽的连接后,相应函数将不再被调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用自定义信号,需要使用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 类型槽函数还有输出。

 

PyQt6 中,`QMessageBox` 是一个非常常用的组件,用于显示对话框消息,例如提示信息、警告或错误消息等。可以通过 `QMessageBox` 的静态方法快速创建弹窗,也可以通过实例化对象并自定义内容来实现更复杂的交互。 ### 显示简单的 QMessageBox 弹窗 以下是一个使用 `QMessageBox.information()` 静态方法显示信息弹窗的示例: ```python from PyQt6.QtWidgets import QApplication, QMessageBox app = QApplication([]) # 显示一个信息弹窗 QMessageBox.information(None, 'Information', 'This is an information message.') app.exec() ``` ### 创建自定义的 QMessageBox 弹窗 如果需要添加更多按钮或者自定义行为,可以实例化 `QMessageBox` 对象,并设置标题、文本和按钮等属性: ```python from PyQt6.QtWidgets import QApplication, QMessageBox app = QApplication([]) msg_box = QMessageBox() msg_box.setIcon(QMessageBox.Icon.Warning) msg_box.setWindowTitle('Custom Dialog') msg_box.setText('Are you sure you want to proceed?') msg_box.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No) # 获取用户点击的按钮 response = msg_box.exec() if response == QMessageBox.StandardButton.Yes: print("User clicked Yes") else: print("User clicked No") app.exec() ``` ### 关键点说明: - `QMessageBox.Icon` 可以设置不同的图标类型,如 `Information`, `Warning`, `Critical`, `Question` 等。 - `setStandardButtons()` 用于设置标准按钮集合,例如 `Yes`, `No`, `Ok`, `Cancel` 等。 - `exec()` 方法会阻塞主线程直到用户关闭弹窗,返回值是用户点击的按钮标识符。 ### 自定义按钮行为 除了使用标准按钮外,还可以添加自定义按钮并通过连接信号与槽函数处理用户的操作: ```python from PyQt6.QtWidgets import QApplication, QMessageBox app = QApplication([]) msg_box = QMessageBox() msg_box.setWindowTitle("Custom Button Example") msg_box.setText("Choose an option:") custom_button = msg_box.addButton("Custom Action", QMessageBox.ButtonRole.ActionRole) msg_box.setStandardButtons(QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel) response = msg_box.exec() if msg_box.clickedButton() == custom_button: print("Custom button clicked") elif response == QMessageBox.StandardButton.Ok: print("OK clicked") else: print("Cancel clicked") app.exec() ``` 以上方法展示了如何在 PyQt6 应用中创建和显示不同类型的 `QMessageBox` 弹窗[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值