Как получить исходные данные Python из QVariant - PullRequest
13 голосов
/ 13 февраля 2012

Я только сейчас изучаю 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 ]

14 голосов
/ 14 февраля 2012

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

>>> from PyQt4.QtCore import QVariant
>>> data = {'key1': 123, 'key2': 456}
>>> v = QVariant((data,))
>>> v.toPyObject()[0]
{'key2': 456, 'key1': 123}
0 голосов
/ 14 июня 2013

Вы можете преобразовать 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 может потерпеть неудачу, если не сможет преобразовать один изключи или значения от строки до диктовки.это может произойти, если у вас нет встроенных типов (str, int, list ..), но в вашем случае это не сработает.

0 голосов
/ 13 февраля 2012

Прежде чем вы сможете сравнить 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.

...