如何从QVariant获取原始Python数据

15 投票
3 回答
15394 浏览
提问于 2025-04-17 12:56

我最近在学习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

在你比较 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())

或者你也可以像 Avaris 上面提到的那样,改变 QString 的行为。

15

你可以通过把你的数据放在一个不可变的容器里来解决这个问题:

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

撰写回答