Как получить исходные данные python из 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 ответов


вы можете обойти эту проблему, обернув свои данные в неизменяемом контейнера:

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

прежде чем вы можете сравнить 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 поведение, как указывал Аварис выше.


вы можете преобразовать дикт в строку и после того, как просто eval (str) его обратно в дикт:

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

просто имейте в виду, что eval может потерпеть неудачу, если он не сможет преобразовать один из ключей или значений из строки в dict. это может произойти, если у вас нет встроенных типов (str, int, list.. ) но в вашем случае это не будет работать никаких проблем.