Support for QSettings

New in version v4.8.3.

Qt provies the QSettings class as a platform independent API for the persistent storage and retrieval of application settings. Settings are retrieved using the QSettings.value() method which, when using v1 of PyQt4’s QVariant API returns a QVariant object. An application will then typically convert the QVariant to the appropriate fundamental type using QVariant.toBool(), QVariant.toInt().

The explicit use of these conversion methods works around a problem with the way different platforms implement the storage of settings. Some platforms only ever store string values which means that the type of the original value is lost. Explicitly calling a conversion method provides the missing type information about the value being retrieved.

A problem then arises when v2 of the QVariant API is used (i.e. the default for Python v3) because those explicit conversion methods are not available. Therefore a setting with an integer value of 42 may be retrieved as a string value of '42'. This inconsistency is made worse by being platform specific.

As a solution to the problem PyQt4’s implementation of QSettings.value() takes an optional third argument called type. This is either a Python type object, e.g. int, or a string that is the name of a C++ type, e.g. 'QStringList'. The value returned will be an object of the requested type.

For example:

from PyQt4.QtCore import QSettings, QPoint

settings = QSettings('foo', 'foo')

settings.setValue('int_value', 42)
settings.setValue('point_value', QPoint(10, 12))

# This will write the setting to the platform specific storage.
del settings

settings = QSettings('foo', 'foo')

int_value = settings.value('int_value', type=int)
print("int_value: %s" % repr(int_value))

point_value = settings.value('point_value', type=QPoint)
print("point_value: %s" % repr(point_value))

When this is executed then the following will be displayed for all platforms:

int_value: 42
point_value: PyQt4.QtCore.QPoint(10, 20)

If the value of the setting is a container (corresponding to either QVariantList, QVariantMap or QVariantHash) then the type is applied to the contents of the container.

For example:

from PyQt4.QtCore import QSettings

settings = QSettings('foo', 'foo')

settings.setValue('list_value', [1, 2, 3])
settings.setValue('dict_value', {'one': 1, 'two': 2})

# This will write the setting to the platform specific storage.
del settings

settings = QSettings('foo', 'foo')

list_value = settings.value('list_value', type=int)
print("list_value: %s" % repr(list_value))

dict_value = settings.value('dict_value', type=int)
print("dict_value: %s" % repr(dict_value))

When this is executed then the following will be displayed for all platforms:

list_value: [1, 2, 3]
dict_value: {'one': 1, 'two': 2}