PySide6 Signal传递字典数据异常:整数键字典为何为空?
问题原因分析
这个差异源于PySide6与PySide2在Qt元类型系统适配逻辑上的不同:
- Qt的信号槽机制依赖元类型系统完成数据的序列化与反序列化。PySide6中声明
Signal(dict)时,会自动将Python字典转换为Qt的QVariantMap类型(本质是QMap<QString, QVariant>),该类型仅支持字符串作为键。当传递整数键的字典时,Qt无法识别非字符串键,序列化过程中会直接丢弃这些键值对,最终槽函数只能收到空字典。 - PySide2对
dict类型信号的处理逻辑更宽松,没有强制转换为Qt的QVariantMap,而是直接传递Python原生字典对象,因此包含非字符串键的字典能正常被槽函数接收。
解决方案
如果需要传递包含非字符串键的字典,可将信号类型改为object,让PySide直接传递Python原生对象,绕过Qt的元类型转换:
class MyThread(QThread): my_signal = Signal(object) # 替换为object类型信号 def run(self): self.my_signal.emit({1: "Hello"}) # 整数键字典可正常传递
内容的提问来源于stack exchange,提问作者ANDERDOW
相关产品推荐
相关产品推荐

