[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