[PyQt] A possible bug in PyQt when loading Boolean values via QSettings

Baz Walter bazwal at ftml.net
Mon Dec 27 20:17:10 GMT 2010


On 27/12/10 10:04, Phil Thompson wrote:
> A typical backend will save values as a string without any metadata
> describing the original type. In QVariant v1 the conversion back is done by
> QVariant::toBool() which only checks for "true" and "false", so that is the
> behaviour to be replicated in QVariant v2.
>
> If this is a problem then I could add an optional keyword argument to
> QSettings.value() that takes a Python type argument and will automatically
> return a value of that type or raise an exception...
>
>      b = settings.value(key, type=bool)
>
> ...or any other suggestions?

i expanded my previous test to include a few other types:

from PyQt4.QtCore import QSettings, QPoint

settings = QSettings('foo', 'foo')
settings.clear()
settings.beginGroup('section')
settings.setValue('bool', False)
print('bool = %s' % repr(settings.value('bool')))
settings.setValue('int', 42)
print('int = %s' % repr(settings.value('int')))
settings.setValue('point', QPoint(10, 20))
print('point = %s' % repr(settings.value('point')))
settings.setValue('list', [1, 2, 3])
print('list = %s' % repr(settings.value('list')))
settings.endGroup()

# re-sync with storage
settings = QSettings('foo', 'foo')
settings.beginGroup('section')
print('bool = %s' % repr(settings.value('bool')))
print('int = %s' % repr(settings.value('int')))
print('point = %s' % repr(settings.value('point')))
print('list = %s' % repr(settings.value('list')))
settings.endGroup()

output for linux, using python 3.1.3, qt 4.7.1, sip 4.11.2, pyqt 4.8.1:

$ python3 settings.py
bool = False
int = 42
point = PyQt4.QtCore.QPoint(10, 20)
list = [1, 2, 3]
bool = 'false'
int = '42'
point = PyQt4.QtCore.QPoint(10, 20)
list = ['1', '2', '3']

output for win xp, using python 3.1.3, qt 4.7.1, sip 4.12, pyqt 4.8.2:

>c:\python31\python.exe settings.py
bool = 'false'
int = 42
point = PyQt4.QtCore.QPoint(10, 20)
list = ['1', '2', '3']
bool = 'false'
int = 42
point = PyQt4.QtCore.QPoint(10, 20)
list = ['1', '2', '3']

so it looks like portability *has* been compromised. there are 
differences between linux and windows both before and after a re-sync.

also, i think xavion may be right to suggest there is at least one other 
bug here. on linux, there is inconsistency between some values before 
and after a re-sync that is not present on windows.

(of course, it goes without saying that the easy way to avoid all these 
complications is to use the QVariant v1 api).




More information about the PyQt mailing list