PyQt QVariant与字典

汉斯·派(Hans Pay)

如果您在python中执行以下代码:

from PyQt4 import uic, QtCore, QtGui
qvdict = QtCore.QVariant(dict(name='a'))
print qvdict.toPyObject()
qvtuple = QtCore.QVariant(('name','a'))
print qvtuple.toPyObject())

结果是:

{PyQt4.QtCore.QString(u'name'): PyQt4.QtCore.QString(u'a')}
('name', 'a')

如您所见,qvdict中的键和字符串值将转换为QString,但不会转换为qvtuble。

有没有一种方法可以完全像使用toPyObject方法初始化QVariant对象时那样保留字典?

我知道我可以通过重建字典并转换每个键和字符串值来完成转换,但是Qt不能给我完全相同的对象吗?

如果有人知道Qt为什么要进行这种转换,我想知道为什么会这样。

ekhumoro

如果可以,PyQt将尝试转换为相应的C ++类型。

对于a dict,这意味着QMap-,但前提是所有键都是字符串。否则,它仅包装对原始文件的引用dict(即没有隐式复制)。

对于list,转换为QList,但是所有包含的元素也都可以转换。

对于tuple,没有对应的C ++类型,因此不尝试进行转换(QVariant因此将仅包含包装的引用)。

这应该立即提出一个解决方法,以确保在与a进行相互转换时保留所有python对象QVariant:只需将其包装在tuple但是,更好的长期解决方案可能是完全避免使用QStringQVariant如果你正在使用Python 2,这可以通过完成SIP模块,以切换到V2 API

import sip
sip.setapi('QString', 2)
sip.setapi('QVariant', 2)

from PyQt4 import QtCore, QtGui

另外,您也可以使用Python 3(默认为v2 API)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章