2012-02-13 20 views
12

Acabo de aprender Python y Qt estos días. Por favor, considere que esta será una pregunta para novatos, pero estoy atrapado aquí.Cómo obtener los datos originales de Python de QVariant

import sys 
from PyQt4.QtCore import * 

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

I expected data3 es lo mismo que data1, 'string'. Sin embargo en mi datos3 sistema es

PyQt4.QtCore.QString(u'string') 

No es un gran problema si los datos que yo quiero para manejar es sencillo, como ejemplo, pero quiero manejar datos de tipo 'dict', así que necesito para solucionar este problema.

Creo que esto es un problema de codificación, pero no puedo encontrar cómo solucionarlo.

* En todos los documentos estoy declarando que:

#-*- coding: utf-8 -*- 
+2

Puede resolver ese "problema" al [configurar 'api' QString' en 2] (http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/incompatible_apis.html) pero, ¿por qué ¿Necesitas convertir a 'QVariant' y volver? – Avaris

Respuesta

13

Puede solucionar este problema, envolviendo sus datos en un recipiente inmutable:

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

¿cómo (data,) hace que los datos sean inmutables, isnt just (data) se comporta como un elemento inmutable o al agregar "," lo convierte en una tupla? –

+3

@san. No hace que _data_ sea inmutable. Si los datos se colocan dentro de un contenedor inmutable (como una tupla), no se realizará ningún intento de conversión. Una tupla no se puede convertir a un tipo de C++ equivalente, por lo que tanto la tupla como su contenido permanecerán sin cambios. También vale la pena afirmar que hay una ventaja de rendimiento al hacer las cosas de esta manera, ya que elude todos los gastos generales de conversión entre Python y C++. – ekhumoro

0

Antes de poder comparar data1 y data3 que necesita para convertir la cadena de Python a QString simplemente escribiendo:

>>> same_as_data1 = str(data3) 

ahora que ha Volvió la misma cadena:

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

Donde aparezca una cadena (como clave o valores), se asignará a QString. Se puede hacer la conversión, ya sea de forma manual, por ejemplo:

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

o puede cambiar el comportamiento QString, como se ha señalado anteriormente Avaris.

+0

Gracias por su respuesta. Sí, funciona para cadenas. ¿Podría decirme cómo manejar los datos de tipo 'dict'? 'code' QVariant ({'key1': 123}). toPyObject()' code' es 'code' {PyQt4.QtCore.QString (u'key1 '): 1234}' código' y no puedo transformarlo a datos del tipo de dict original –

-2

Se puede convertir el dict en una cadena y después de sólo eval (str) de nuevo a un diccionario:

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

Solo tenga en cuenta que el eval puede fallar si no puede convertir una de las claves o valores de cadena a dict. esto puede suceder si tiene un tipo none built_in (str, int, list ...) pero en su caso no tendrá problemas.

Cuestiones relacionadas