Подтвердить что ты не робот

Как получить исходные данные python из QVariant

Я просто изучаю python и Qt в эти дни. Поэтому, пожалуйста, подумайте, что это будет вопрос новичков, но я застрял здесь.

import sys
from PyQt4.QtCore import *

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

Я ожидал, что данные3 будут такими же, как data1, 'string'. Однако в моей системе data3 есть

PyQt4.QtCore.QString(u'string')

Это не очень важно, если данные, которые я хочу обрабатывать, просты, как пример, но я хочу обрабатывать данные типа "dict", поэтому мне нужно исправить эту проблему.

Я думаю, что это проблема кодирования, но не могу найти, как ее исправить.

* В каждом документе я объявляю, что:

#-*- coding: utf-8 -*-
4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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