[PyQt] Unsatisfactory behaviour of QSettings

Phil Thompson phil at riverbankcomputing.com
Fri May 30 23:38:30 BST 2014


On 30/05/2014 4:56 pm, Baz Walter wrote:
> On 30/05/14 14:41, Phil Thompson wrote:
>> I can't reproduce this using any of the Python2/PyQt4, Python3/PyQt4 
>> and
>> Python3/PyQt5 combinations.
> 
> Sorry: my fault for not specifying the platform.
> 
> Just so we're on the same page, here's a test script:
> 
> =======>8=======
> 
> from PyQt4 import QtCore
> # from PyQt5 import QtCore
> 
> def set_option(key, value):
>     s = QtCore.QSettings('test', 'test')
>     s.setValue('section/%s' % key, value)
> 
> def get_option(key, default=None, typeinfo=None):
>     s = QtCore.QSettings('test', 'test')
>     try:
>         if typeinfo is None:
>             return s.value('section/%s' % key, default)
>         return s.value('section/%s' % key, default, typeinfo)
>     except TypeError as exception:
>         return exception
> 
> set_option('key1', [])
> print(repr(get_option('key1', [])))
> print(repr(get_option('key1', [], 'QStringList')))
> 
> set_option('key2', ['a'])
> print(repr(get_option('key2', [])))
> print(repr(get_option('key2', [], 'QStringList')))
> 
> =======>8=======
> 
> Output for me on Linux with python2 and pyqt4:
> 
> <PyQt4.QtCore.QVariant object at 0x1b39cf8>
> TypeError('unable to convert a QVariant of type 0 to a QMetaType of 
> type 11',)
> <PyQt4.QtCore.QVariant object at 0x1b39cf8>
> [<PyQt4.QtCore.QStringList object at 0x1b39cf8>]
> 
> with python3 and pyqt4/pyqt5:
> 
> None
> TypeError('unable to convert a QVariant of type 0 to a QMetaType of 
> type 11',)
> ['a']
> [['a']]
> 
> The test.conf file looks like this (all combinations):
> 
> [section]
> key1=@Invalid()
> key2=@Variant(\0\0\0\t\0\0\0\x1\0\0\0\n\0\0\0\x2\0\x61)
> 
> On Windows, the corresponding output is:
> 
> <PyQt4.QtCore.QVariant object at 0x00B65770>
> <PyQt4.QtCore.QStringList object at 0x00B65770>
> <PyQt4.QtCore.QVariant object at 0x00B65770>
> <PyQt4.QtCore.QStringList object at 0x00B65770>
> 
> and:
> 
> []
> []
> ['a']
> ['a']

Fixes will be in tonight's PyQt4 and PyQt5 snapshots.

The only platform-specific difference is the first line of the output of 
your test. On Linux it is None, and [] on other platforms. IMHO this is 
a Qt bug. Anyway, PyQt is reflecting the underlying Qt behaviour. 
However if you so the right thing and specify a type then the behaviour 
is consistent.

Thanks,
Phil


More information about the PyQt mailing list