2017-01-21 5 views
1

以下のコードは、QSettingsオブジェクトを使用してPython data辞書を格納しています。辞書を戻ってそれを読んだ後 はそうのようなQStringなど、すべてのキーが付属しています:QSettingsでPython辞書を保存する方法

{PyQt4.QtCore.QString(u'one'): 1, PyQt4.QtCore.QString(u'two'): 2} 

このような通常の文字列のキーを持つ辞書を読み取ることが可能になる場合、私は疑問に思う:

{'one': 1, 'two': 2} 

コード:

from PyQt4 import QtCore, QtGui 
app = QtGui.QApplication([]) 

settings = QtCore.QSettings('apps', 'settings') 

data = {'one': 1, 'two': 2} 

settings.setValue('data', data) 

data = settings.value('data').toPyObject() 
print data 

答えて

1
  • Python2

直接使用することはできません。通常の辞書に変換する必要があります。

d = {} 
for k, v in data.items(): 
    d[str(k)] = v 

完全なコード:

from PyQt4 import QtCore, QtGui 
app = QtGui.QApplication([]) 

settings = QtCore.QSettings('apps', 'settings') 

data = {'one': 1, 'two': 2} 

settings.setValue('data', data) 

data = settings.value('data').toPyObject() 
d = {} 
for k, v in data.items(): 
    d[str(k)] = v 

print(d) 

出力:

{'two': 2, 'one': 1} 
  • のpython3

この問題は、正規の辞書を返すので存在しません。toPyObject()で変換する必要はなくなりました。

from PyQt4 import QtCore, QtGui 
app = QtGui.QApplication([]) 

settings = QtCore.QSettings('apps', 'settings') 

data = {'one': 1, 'two': 2} 

settings.setValue('data', data) 

data = settings.value('data') 
print(data) 

出力:

{'one': 1, 'two': 2} 
+2

Python 2でこれを行うことが可能であるあなたがする必要があるのは、使用ある[sip.setapi](http://pyqt.sourceforge.net /Docs/PyQt4/incompatible_apis.html)を使って、Python 3と同じ動作をさせてください。なぜ誰かがそれらの厄介な 'QString'と' QVariant'型をコードに入れたいのか分かりません。 'str()'で変換することはPython 2でもバグです。デコード/エンコードエラーを避けるために変換を行うには常に 'unicode()'を使うべきです。 – ekhumoro

0
original = {PyQt4.QtCore.QString(u'one'): 1, PyQt4.QtCore.QString(u'two'): 2} 
converted = {str(k): val for k, v in original.items()} 
+0

これは実際にはあまりにも短くて、特に他のより包括的な答えと比べて、便利です。説明を追加する必要があります。 –

関連する問題