Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从QVariant获取原始python数据_Python_Pyqt_Pyqt4_Data Conversion_Qvariant - Fatal编程技术网

如何从QVariant获取原始python数据

如何从QVariant获取原始python数据,python,pyqt,pyqt4,data-conversion,qvariant,Python,Pyqt,Pyqt4,Data Conversion,Qvariant,这些天我只是在学习python和Qt。因此,请考虑这将是一个新的问题,但我被困在这里。< /P> import sys from PyQt4.QtCore import * data1 = 'string' data2 = QVariant(data1) data3 = data2.toPyObject() 我期望数据3与数据1相同,“字符串”。然而,在我的系统中,data3是 PyQt4.QtCore.QString(u'string') 如果我想处理的数据像示例一样简单,那也没什么大不

这些天我只是在学习python和Qt。因此,请考虑这将是一个新的问题,但我被困在这里。< /P>
import sys
from PyQt4.QtCore import *

data1 = 'string'
data2 = QVariant(data1)
data3 = data2.toPyObject()
我期望数据3与数据1相同,“字符串”。然而,在我的系统中,data3是

PyQt4.QtCore.QString(u'string')
如果我想处理的数据像示例一样简单,那也没什么大不了的,但我想处理“dict”类型的数据,所以我需要解决这个问题

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

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

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

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

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

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

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

您可以将dict转换为字符串,然后在求值(str)后将其转换回dict:

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

请记住,如果无法将其中一个键或值从字符串转换为dict,则评估可能会失败。如果您有无内置类型(str、int、list…),则可能会发生这种情况,但在您的情况下,它不会出现任何问题。

您可以通过以下方法解决“问题”:,为什么您需要转换为
QVariant
并返回?谢谢您的回答。是的,它适用于字符串。你能告诉我如何处理“dict”类型的数据吗
code
QVariant({'key1':123})。toPyObject()
code
code
{PyQt4.QtCore.QString(u'key1'):1234}
code
并且我无法将其转换为原始dict类型数据(data),)如何使数据不可变,不仅仅是(data)表现为不可变或添加的,还是“使其成为元组?”@san。它不会使数据不可变。如果数据放在不可变的容器(如元组)中,则不会尝试进行转换。元组不能转换成等效的C++类型,因此元组及其内容都将保持不变。同样值得指出的是,这样做有一个性能优势,因为它绕过了Python和C++类型之间来回转换的所有开销。