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}