[PyQt] List-like objects and QVariant

Phil Thompson phil at riverbankcomputing.com
Thu Jan 21 12:34:27 GMT 2010


On Wed, 20 Jan 2010 12:48:44 +0100, "Sybren A. Stüvel" <sybren at stuvel.eu>
wrote:
> Hi all,
> 
> This is my first post to this list. I'm a software engineer at Chess in 
> Haarlem, The Netherlands, and I'm using PyQt to develop a testing
> application. 
> 
> We created a TestSuite class that contains a filename and an ordered 
> dictionary of TestCase objects The TestSuite class implements the
> __getitem__ 
> method to get a test case by either its ID or its index number. It also 
> implements the __len__ method to return the number of test cases stored.
> 
> We're unable to store such a TestSuite object in a QVariant object.
> QVariant 
> seems to think that __len__ + __getitem__ equals "list", so the TestSuite

> object is converted into a list of TestCases. This means that nearly all 
> information stored in TestSuite is lost when storing it in a QVariant.

The current behaviour is to allow any sequence to be converted to a
QVariantList. When converting back it can only be to a Python list because
the fact that it was originally something else has been forgotten.

This behaviour is wrong - I should have changed it when I changed the
behaviour for Qt sub-classes in PyQt v4.5 (see the PyQt docs about
potential incompatibilities). I will fix it for PyQt v4.7.1.

As a workaround you could wrap your class as an attribute of another
(non-sequence) class when converting to QVariant and unwrap it when
converting back.

Phil


More information about the PyQt mailing list