[PyQt] QVariant bug(?)

Phil Thompson phil at riverbankcomputing.com
Wed Sep 3 09:13:12 BST 2008


On Wed, 3 Sep 2008 08:07:25 +0200, "Arve Knudsen" <arve.knudsen at gmail.com>
wrote:
> On Tue, Sep 2, 2008 at 11:15 PM, Phil Thompson
> <phil at riverbankcomputing.com> wrote:
>> 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).
> 
> Well, I'm confused, since I patched PyQt myself, and calling
> toPyObject() on the QVariant in my case returns the expected
> StringValue object.

Obviously I can't comment on the behaviour of your patched version.

> Are you talking about a different case, i.e.
> dealing with a QVariant created in C++ (and containing a C++ object)?

That's one use case that will work after tonight's snapshots.

Phil



More information about the PyQt mailing list