15

最近は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 -*-
4

3 に答える 3

15

この問題を回避するには、データを不変のコンテナーにラップします。

>>> from PyQt4.QtCore import QVariant
>>> data = {'key1': 123, 'key2': 456}
>>> v = QVariant((data,))
>>> v.toPyObject()[0]
{'key2': 456, 'key1': 123}
于 2012-02-13T20:26:17.380 に答える
0

比較data1してPython文字列data3に変換する前に、次のように記述します。QString

>>> 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が上で指摘したように、動作を変更することもできます。

于 2012-02-13T08:35:45.777 に答える
-2

dictを文字列に変換し、eval(str)を実行した後、dictに戻すことができます。

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

キーまたは値の1つを文字列からdictに変換できない場合、evalが失敗する可能性があることに注意してください。これは、組み込み型(str、int、list ..)がない場合に発生する可能性がありますが、この場合は問題なく機能します。

于 2013-06-14T01:18:34.183 に答える