如何从QVariant获取原始Python数据
我最近在学习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 -*-
3 个回答
-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 无法把某个键或值从字符串转换回字典,它可能会出错。这种情况通常发生在你有一些不是内置类型的东西(比如 str、int、list 等)时。不过在你的情况下,这个方法应该没问题。
0
在你比较 data1
和 data3
之前,你需要把 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())
或者你也可以像 Avaris 上面提到的那样,改变 QString
的行为。
15
你可以通过把你的数据放在一个不可变的容器里来解决这个问题:
>>> from PyQt4.QtCore import QVariant
>>> data = {'key1': 123, 'key2': 456}
>>> v = QVariant((data,))
>>> v.toPyObject()[0]
{'key2': 456, 'key1': 123}