2017-01-21 3 views
1

Le code ci-dessous stocke le dictionnaire Python data en utilisant l'objet QSettings. Après l'avoir lu de nouveau le dictionnaire est livré avec toutes ses clés comme QString comme ceci:Comment stocker le dictionnaire Python avec QSettings

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

Je me demande s'il serait possible de lire le dictionnaire avec les clés de chaîne régulière comme celle-ci:

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

code:

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 

Répondre

1
  • python2

Ce n'est pas possible directement, vous devez les convertir en un dictionnaire régulier.

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

Code complet:

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) 

sortie:

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

Ce problème n'existe pas car il vous renvoie un dictionnaire régulier, il n'est plus nécessaire de le convertir avec 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) 

sortie:

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

Il est possible de le faire en Python 2. Tout ce que vous devez faire est d'utiliser [sip.setapi] (http://pyqt.sourceforge.net /Docs/PyQt4/incompatible_apis.html) pour obtenir le même comportement que Python 3. Je ne sais pas pourquoi quelqu'un voudrait garder ces méchants 'QString' et' QVariant' types dans leur code. La conversion avec 'str()' est également buggée dans Python 2 - vous devriez toujours utiliser 'unicode()' pour effectuer la conversion afin d'éviter les erreurs de décodage/encodage. – 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

Ceci est vraiment trop bref pour être utile, surtout par rapport à l'autre, réponse beaucoup plus complète. L'explication devrait être ajoutée. –