You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"

解决步骤

  1. 从PySide6.QtCore导入QVariant
  2. 将Signal的类型从object改为QVariant
  3. 将Property的类型从object改为QVariant
  4. 发射信号和返回属性值时,将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:25:22