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

PySide2通过Signal传字典到QML显示undefined问题排查

嘿,我找到你问题的症结啦!

你的问题出在Python信号的类型定义上:你用Signal(dict)声明了要传递字典的信号,但PySide2没办法自动把Python原生的dict转换成QML能识别的JavaScript对象。Qt的跨语言信号槽机制依赖自己的元类型系统,而原生Python字典不在默认支持的可跨语言传递类型列表里,所以QML端接收到的自然就是undefined了。

怎么解决?

很简单,把信号的类型改成QVariant或者QVariantMap就行——这俩都是Qt原生支持的类型,QML会自动把它们解析成JavaScript对象。

方案1:用QVariant类型修改Python代码

在你的Test1类里,把信号定义替换成这样:

from PySide2.QtCore import QVariant
# ...
class Test1(QObject):
    theSignal = Signal(QVariant)  # 也可以写成 Signal('QVariant')
    # 剩下的代码保持不变

方案2:用QVariantMap(更明确的键值对类型)

如果想更清晰地表明你传递的是键值对结构,可以用QVariantMap:

from PySide2.QtCore import QVariantMap
# ...
class Test1(QObject):
    theSignal = Signal(QVariantMap)
    # 剩下的代码保持不变

不管选哪种方案,你原来的self.theSignal.emit(testDict)代码都不用改——PySide2会自动把Python字典转换成对应的Qt类型,QML端就能正确接收并解析成你想要的JS对象了。

修改后验证

运行调整后的代码,切换ComboBox的选项时,就能得到你预期的输出:

Caught: 1
qml: {"myAnswer":1}
Caught: 2
qml: {"myAnswer":2}
...

小补充

如果以后需要传递更复杂的自定义数据结构,可能需要用到qmlRegisterType这类工具注册自定义类型,但对于简单的键值对字典,用QVariant或QVariantMap完全够用啦。

内容的提问来源于stack exchange,提问作者Lando1784

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 03:42:46