如何使用 QSettings 存储 Python 字典

Posted

技术标签:

【中文标题】如何使用 QSettings 存储 Python 字典【英文标题】:How to store Python dictionary with QSettings 【发布时间】:2017-01-21 02:52:37 【问题描述】:

下面的代码使用QSettings 对象存储Python data 字典。 读回字典后,字典的所有键都为QString,如下所示:

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

【讨论】:

在 Python 2 中可以做到这一点。您需要做的就是使用 sip.setapi 来获得与 Python 3 相同的行为。我不知道为什么有人想要保留这些讨厌的东西QStringQVariant 输入他们的代码。在 Python 2 中使用 str() 进行转换也是错误的 - 您应该始终使用 unicode() 进行转换以避免解码/编码错误。【参考方案2】:
original = PyQt4.QtCore.QString(u'one'): 1, PyQt4.QtCore.QString(u'two'): 2
converted = str(k): val for k, v in original.items()

【讨论】:

这确实太简短而无用,特别是与其他更全面的答案相比。应添加说明。

以上是关于如何使用 QSettings 存储 Python 字典的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QSettings 将 QString 添加到注册表

为啥 QSettings 不存储任何内容?

Qsettings 只能存储一次价值?

QSettings使用方法

从 QSettings 派生并存储 QIcon

不同类型的 QSettings