@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
信号。