[PyQt] QVariant bug(?)

Phil Thompson phil at riverbankcomputing.com
Tue Sep 2 22:15:31 BST 2008


On Tue, 2 Sep 2008 22:12:54 +0200, "Arve Knudsen" <arve.knudsen at gmail.com>
wrote:
> On Tue, Sep 2, 2008 at 4:04 PM, Phil Thompson
> <phil at riverbankcomputing.com> wrote:
>> On Tue, 2 Sep 2008 11:29:00 +0200, "Arve Knudsen"
> <arve.knudsen at gmail.com>
>> wrote:
>>> I have created a simple test case which triggers a likely bug in PyQt.
>>> As the case demonstrates, I have a class template "PropertyValue"
>>> which I wrap and use with QVariant. When I run the test program
>>> ("tst.py") however, there is a segfault in the PropertyValue copy
>>> constructor. The reason as far as I've been able to tell is that PyQt
>>> doesn't register its own metatype for "StringValue"
>>> (PropertyValue<QString>), since this is already constructed for the
>>> C++ type (see qobject.sip, line 1479), with chaotic results (the C++
>>> copy constructor receives a raw PyObject for the right-hand-side
>>> argument).
>>
>> The bug should be fixed in tonight's PyQt snapshot.
>>
>> However, it leaves the question as to how you would get the instance
> back
>> out of the QVariant. QVariant.toPyObject() only handles Python objects
> at
>> the moment - not wrapped non-Qt C++ instances as you have.
>>
>> I think I need to add an optional type argument to toPyObject(), eg...
>>
>>    my_string_value = variant.toPyObject(StringValue)
> 
> I don't understand what you mean here. QVariant.toPyObject currently
> works with StringValue objects?

No, and it still won't after the bug is fixed - but there needs to be some
way to convert the C++ instance to a Python object (ie. to do the reverse
of what your test case does).

Since my response above I've thought of a way to do it without needing the
extra argument to toPyObject(), but it will require SIP and PyQt changes.

Phil



More information about the PyQt mailing list