Как получить исходные данные 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.. ) но в вашем случае это не будет работать никаких проблем.