如何从QVariant获取原始python数据

时间:2012-02-13 08:25:36

标签: python pyqt pyqt4 data-conversion qvariant

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

import sys
from PyQt4.QtCore import *

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

我预计data3与data1,'string'相同。但是在我的系统中,data3是

PyQt4.QtCore.QString(u'string')

如果我想处理的数据很简单,例如,但是我想处理'dict'类型的数据,所以我需要解决这个问题。

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

*在我宣布的每一份文件中:

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

3 个答案:

答案 0 :(得分:14)

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

>>> from PyQt4.QtCore import QVariant
>>> data = {'key1': 123, 'key2': 456}
>>> v = QVariant((data,))
>>> v.toPyObject()[0]
{'key2': 456, 'key1': 123}

答案 1 :(得分: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在上面指出的那样。

答案 2 :(得分:-2)

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

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

请记住,如果eval无法将其中一个键或值从string转换为dict,则eval可能会失败。如果你有一个没有build_in类型(str,int,list ..)会发生这种情况,但在你的情况下,它不会有任何问题。