[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