[PyQt] Segfault when trying to rely on QStyledItemDelegate.setEditorData/ModelData default behavior

Elvis Stansvik elvstone at gmail.com
Fri Feb 12 17:14:57 GMT 2016


2016-02-12 17:42 GMT+01:00 Phil Thompson <phil at riverbankcomputing.com>:
> On 12 Feb 2016, at 2:27 pm, Elvis Stansvik <elvstone at gmail.com> wrote:
>>
>> 2016-02-12 13:35 GMT+01:00 Phil Thompson <phil at riverbankcomputing.com>:
>>> On 12 Feb 2016, at 12:31 pm, Elvis Stansvik <elvstone at gmail.com> wrote:
>>>>
>>>> 2016-02-12 12:14 GMT+01:00 Phil Thompson <phil at riverbankcomputing.com>:
>>>>> On 11 Feb 2016, at 8:53 pm, Elvis Stansvik <elvstone at gmail.com> wrote:
>>>>>>
>>>>>> 2016-02-11 21:14 GMT+01:00 Elvis Stansvik <elvstone at gmail.com>:
>>>>>>> I found the problem, I had forgot to change the user property from
>>>>>>> dict to QVariant (was testing around).
>>>>>>>
>>>>>>> With the property of type QVariant, it seems to work fine.
>>>>>>
>>>>>> I'm actually still interested in why I need to declare the Qt property
>>>>>> as QVariant here. Why do I get a segfault if I declare it as dict?
>>>>>>
>>>>>> That is, in the paste
>>>>>> https://gist.github.com/estan/c051d1f798c4c46caa7d , why must it be
>>>>>>
>>>>>>  @pyqtProperty(QVariant, user=True)
>>>>>>  def values(self):
>>>>>>      return self._values
>>>>>>
>>>>>> and not
>>>>>>
>>>>>>  @pyqtProperty(dict, user=True)
>>>>>>  def values(self):
>>>>>>      return self._values
>>>>>>
>>>>>> ?
>>>>>>
>>>>>> The value I store there (self._values) is a dict after all. Does it
>>>>>> have something to do with the way in which
>>>>>> QStyledItemDelegate::setEditorData sets the property?
>>>>>
>>>>> Yes. It passes the address of a QVariant. PyQt uses the type of the property to tell it what to do with the address.
>>>>
>>>> Aha, I think I understand: QStyledItemDelegate::setEditorData wraps
>>>> the value in a QVariant, and then crashes when trying to set the
>>>> property, because QVariant can't be converted to dict..?
>>>
>>> A QVariant can be converted to a dict (otherwise your code wouldn't work at all) - but PyQt needs to know that it is a QVariant in the first place.
>>
>> Hm, okay. But my goal was to keep this property as a dict, since
>> that's the data I'm storing, and not a QVariant. Why can't I declare
>> the property as a dict (since that's the data the editor is working
>> with), and then when QStyledItemDelegate::setEditorData sets the
>> property with a QVariant (which contains my dict), that QVariant is
>> automatically converted to a dict? (since that's what the property is
>> declared as).
>>
>> Sorry if I'm a little thick :/
>
> No, I am.
>
> Should be fixed in tonight's snapshot.

Excellent! :) Since we're basing our product on Debian packaged PyQt,
I'll just live with having the "transport" QVariant property for now.

Just out of curiosity, was this a fix of some general problem so to
speak, or was the fix to add some custom code (to the wrapping of
QStyledItemDelegate::setEditorData) that handles this particular case?

Have a nice weekend anyway, and many thanks!

Elvis

>
> Thanks,
> Phil


More information about the PyQt mailing list