PySide6 @Property

@Property 是 PySide 中用于定义 Python 属性与 QML 交互的装饰器。当你使用 @Property 装饰器时,你实际上是在创建一个 Qt 属性,它可以在 QML 和 Python 之间进行双向绑定。

@Property(str, notify=userNameChanged) 的含义

通过这种方式,你可以确保 QML 界面能够及时响应 Python 后端数据模型中的变化,保持两者之间的同步。这种机制对于构建响应式的用户界面非常重要。

  • str:这是属性的数据类型。在这个例子中,str 表示该属性是一个字符串类型。Qt 属性可以是基本数据类型(如 int、float、bool)、字符串(str)、列表(QVariantList)、字典(QVariantMap),或者是任何继承自 QObject 的类。

  • notify=userNameChanged:这是一个信号(Signal),当属性值发生变化时会发射此信号。这个参数是可选的,但强烈建议为每个属性提供一个通知信号,以便 QML 界面能够响应属性值的变化并更新自身。userNameChanged 是一个 Signal 对象,它应该在属性值改变时被发射,以通知 QML 或其他监听者属性值已经更改。

    from PySide6.QtCore import QObject, Signal, Property
    
    class MainWindowViewModel(QObject):
        def __init__(self, parent=None):
            super().__init__(parent)
            self._userName = '我是初始值'
    
        # 定义一个信号,当 userName 属性改变时发射
        userNameChanged = Signal(str)
    
        # 使用 @Property 装饰器定义 userName 属性
        @Property(str, notify=userNameChanged)
        def userName(self):
            return self._userName
    
        # 定义 setter 方法来设置 userName 属性的值
        @userName.setter
        def setUserName(self, value):
            if self._userName != value:
                self._userName = value
                self.userNameChanged.emit(value)  # 发射信号通知属性已更改

    解释:

  • @Property(str, notify=userNameChanged):这行代码告诉 PySide,userName 是一个属性,它的值是一个字符串 (str) 类型,并且当它的值发生改变时,应该发射 userNameChanged 信号。这意味着,如果 QML 绑定到这个属性,它会在每次属性值改变时收到通知,并自动更新界面。

  • Getter 方法 (def userName(self)):这是获取属性值的方法。每当 QML 或 Python 代码读取 userName 属性时,都会调用这个方法返回当前的 _userName 值。

  • Setter 方法 (def setUserName(self, value)):这是设置属性值的方法。当从 Python 代码中设置 userName 属性的值时,会调用这个方法。它检查新值是否不同于现有值,如果是,则更新 _userName 并发射 userNameChanged 信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值