PyQt4:将列表保存到QSettings

问题描述 投票:3回答:2

我制作了一个列表(数组)来计算游戏结束次数。但如果有人重新开始游戏,列表的长度将重置。

据我所知,QSettings致力于保存和存储数据。我已阅读文档,但对我没有帮助。

例如,我有一个全局数组:

global finishcount
finishcount = []

如何将此应用于QSettings?那么我可以在其上附加数据而不会在重启后丢失数据。

它应该看起来像这样吗?

from PyQt4 import QtGui, QtCore
global finishcount
finishcount = []
settings = QtCore.QSettings(self)
settings.setValue(finishcount, self)

我怎样才能做到这一点?或者我可以在QSettings中列出我可以附加内容的列表吗?

python pyqt pyqt4
2个回答
2
投票

下面是一个非常简单的演示,演示了如何读取和写入QSettings的整数列表。每次打开和关闭窗口时,演示都会自动添加一个新值。

如果您正在使用PyQt,则根本不需要使用json。对于列表,只需提供默认值,并指定包含值的类型:

    settings.value('finishcount', [], int)

演示:

from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        settings = QtCore.QSettings('my_org', 'my_app')
        self._finishcount = settings.value('finishcount', [], int)
        print('read settings: %s' % self._finishcount)
        # add a new value for testing
        self._finishcount.append(len(self._finishcount))

    def closeEvent(self, event):
        settings = QtCore.QSettings('my_org', 'my_app')
        settings.setValue('finishcount', self._finishcount)
        print('save settings: %s' % self._finishcount)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 100, 100)
    window.show()
    sys.exit(app.exec_())

注意:对于字符串列表的特殊情况,最好使用:

    settings.value('finishcount', [], 'QStringList')

而不是用str指定类型。否则,空列表不会得到正确处理。


1
投票

通常它看起来像这样。这也假设您使用v2版本的QVariant api;否则,从QSettings.value返回的结果将是一个QVariant,你需要将它转换为适当的python类型。如果您使用的是PyQt的最新版本,那么您应该在v2but if not you can force it上将其粘贴在文件的顶部

import sip
sip.setapi('QVariant', 2)
sip.setapi('QString', 2)

此外,即使使用api的v2版本,它通常并不总是按预期工作,比字符串或数字更复杂。对于更复杂的类型,如listsdicts,我发现使用jsonpickle序列化值通常更好,并将其保存到QSettings,然后在检索时自行反序列化。

import json

class MyWidget(QWidget):

    def __init__(self, parent):
        super(MyWidget, self).__init__(parent)
        self.myvalue = 10
        self.mylist = [1,2,3]
        self.restoreSettings()

    def closeEvent(self, event):
        self.saveSettings()
        super(MyWidget, self).closeEvent(event)

    def saveSettings(self):
        settings = QSettings('myorg', 'myapp')
        settings.setValue('myvalue', self.myvalue)
        settings.setValue('mylist', json.dumps(self.mylist))

    def restoreSettings(self):
        settings = QSettings('myorg', 'myapp')
        self.myvalue = settings.value('myvalue', self.myvalue)
        try:
            self.mylist = json.loads(settings.value('mylist', None))
        except (ValueError, TypeError):
            pass
© www.soinside.com 2019 - 2024. All rights reserved.