[PyKDE] Found cure for bizarre backtrace - ???
Phil Thompson
phil at river-bank.demon.co.uk
Tue Jul 2 18:52:01 BST 2002
Bill Soudan wrote:
> On Tue, 2 Jul 2002, Bill Soudan wrote:
>
>
>>I'm going to do some more debugging today. If I can't find anything else
>>out about the exception, I'll prune the code down and post it.
>>
>
> Alright, I've narrowed the culprit down to my subclassed QListViewItem.
> I add a single MonitorItem to the listview, send rapid-fire XMLRPC
> messages to the GUI, and when I click on the item, the exception occurs.
>
> class MonitorItem(QListViewItem):
> def __init__(self, host, port, parent = None, name = None):
> QListViewItem.__init__(self, parent, name)
>
> def text(self, column):
> return 'test'
>
> I've found two different ways to get rid of the dump:
>
> 1) don't override the text method. Not really practical.
>
> 2) modify the text method to return QString('text') instead of just 'text'.
>
> I always thought PyQt is supposed to convert between Python strings and
> QStrings automatically. I reviewed the docs though and they don't
> specifically say whether returning Python strings from C++ methods is
> acceptable, nor does QListViewItem have any caveats listed. So is #2 the
> proper fix?
No, you shouldn't need to do it - it should be done for you. The
generated code that does it is sipForceConvertTo_QString() and
sipConvertTo_QString(). Your #2 means a different code path is taken in
the latter function.
I think the exception is a false one. Try the following fix to
sipTransferSelf() in siplib.c (the comment just above this code gives
some explaination).
if ((sipThis = sipMapSelfToThis(sipSelf)) != NULL)
{
if (toCpp)
{
sipResetPyOwned(sipThis);
if (!sipIsExtraRef(sipThis))
{
sipSetIsExtraRef(sipThis);
Py_INCREF(sipSelf);
}
}
else
{
sipSetPyOwned(sipThis);
if (sipIsExtraRef(sipThis))
{
sipResetIsExtraRef(sipThis);
Py_DECREF(sipSelf);
}
}
}
>>> Add the following two lines <<<
else
PyErr_Clear();
Phil
More information about the PyQt
mailing list