15

这些天我只是在学习python和Qt。所以请考虑这将是一个新手问题,但我被困在这里。

import sys
from PyQt4.QtCore import *

data1 = 'string'
data2 = QVariant(data1)
data3 = data2.toPyObject()

我预计 data3 与 data1 相同,“字符串”。但是在我的系统中 data3 是

PyQt4.QtCore.QString(u'string')

如果我要处理的数据很简单,比如示例,这没什么大不了的,但我想处理 'dict' 类型的数据,所以我需要解决这个问题。

我认为这是编码问题,但找不到解决方法。

*在每份文件中,我声明:

#-*- coding: utf-8 -*-
4

3 回答 3

15

您可以通过将数据包装在不可变容器中来解决此问题:

>>> from PyQt4.QtCore import QVariant
>>> data = {'key1': 123, 'key2': 456}
>>> v = QVariant((data,))
>>> v.toPyObject()[0]
{'key2': 456, 'key1': 123}
于 2012-02-13T20:26:17.380 回答
0

在您进行比较之前data1data3您需要将其转换QString为 Python 字符串,只需编写:

>>> same_as_data1 = str(data3)

现在你得到了相同的字符串:

>>> data1 == data
data1 == same_as_data1
True

无论字符串出现在哪里(作为键或值),它都会映射到QString. 您可以手动进行转换,例如:

d = QVariant({'key1':123}).toPyObject()
d_with_str_keys = dict((str(k), v) for k,v in d.iteritems())

或者您可以更改QString行为,正如 Avaris 上面指出的那样。

于 2012-02-13T08:35:45.777 回答
-2

您可以将字典转换为字符串,然后在 eval(str) 之后将其转换回字典:

pydict  = {'key1': 'val1', 'key2': 'val2'}
variant = QtCore.QVariant( pydict )
...
pydict = eval( str( variant.toString() ) )
print pydict
>>> {'key1': 'val1', 'key2': 'val2'}

请记住,如果无法将键或值之一从字符串转换为字典,则 eval 可能会失败。如果您没有内置类型(str,int,list..),则可能会发生这种情况,但在您的情况下,它不会有任何问题。

于 2013-06-14T01:18:34.183 回答