PySide6中QVariant已移除,替代方案及报错解决方法是什么?
PySide6中用QVariant解决属性类型不兼容问题
PySide6官方已移除QVariant,但在部分与Qt属性系统交互的场景中,必须显式使用它才能避免类型错误。
比如以下TreeNode类的实现中,Signal和Property若用object类型替代QVariant,会触发报错:
class TreeNode(QObject): dataChanged = Signal(object, int) # 此处需指定QVariant def __init__(self, parent = None): super().__init__(parent) self._itemData = {} self._childNodes = [] def setData(self, value, role=Qt.DisplayRole): self._itemData[role] = value self.dataChanged.emit(value, role) @Property(object, fset=setData, notify=dataChanged) # 此处需指定QVariant def data(self, role=Qt.DisplayRole): return self._itemData.get(role)
报错内容:
Invalid property assignment: unsupported type "PySide::PyObjectWrapper"
解决步骤
- 从
PySide6.QtCore导入QVariant - 将Signal的类型从
object改为QVariant - 将Property的类型从
object改为QVariant - 发射信号和返回属性值时,将Python对象包装为QVariant实例
调整后的完整代码:
from PySide6.QtCore import QObject, Signal, Property, Qt, QVariant class TreeNode(QObject): dataChanged = Signal(QVariant, int) def __init__(self, parent = None): super().__init__(parent) self._itemData = {} self._childNodes = [] def setData(self, value, role=Qt.DisplayRole): self._itemData[role] = value self.dataChanged.emit(QVariant(value), role) @Property(QVariant, fset=setData, notify=dataChanged) def data(self, role=Qt.DisplayRole): return QVariant(self._itemData.get(role))
虽然PySide6官方不推荐直接使用QVariant,但在Qt属性系统无法正确识别Python原生对象的场景下,显式使用QVariant是可行的解决方案。
内容的提问来源于stack exchange,提问作者Kamichanw
相关产品推荐
相关产品推荐

