如果您在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为什么要进行这种转换,我想知道为什么会这样。
如果可以,PyQt将尝试转换为相应的C ++类型。
对于a dict
,这意味着QMap
-,但前提是所有键都是字符串。否则,它仅包装对原始文件的引用dict
(即没有隐式复制)。
对于list
,转换为QList
,但是所有包含的元素也都可以转换。
对于tuple
,没有对应的C ++类型,因此不尝试进行转换(QVariant
因此将仅包含包装的引用)。
这应该立即提出一个解决方法,以确保在与a进行相互转换时保留所有python对象QVariant
:只需将其包装在tuple
。但是,更好的长期解决方案可能是完全避免使用QString
和QVariant
。如果你正在使用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] 删除。
我来说两句