[prev in list] [next in list] [prev in thread] [next in thread]
List: pykde
Subject: Re: [PyKDE] QModelIndex and PyQT
From: Torsten Marek <shlomme () gmx ! net>
Date: 2006-05-26 12:08:31
Message-ID: 4476EFBF.1030700 () gmx ! net
[Download RAW message or body]
[Attachment #2 (multipart/signed)]
[Attachment #4 (multipart/mixed)]
Phil Thompson wrote:
> On Friday 26 May 2006 12:24 pm, Torsten Marek wrote:
>> Phil Thompson wrote:
>>> On Wednesday 24 May 2006 10:39 pm, Allen Bierbaum wrote:
>>>> I apologize if this has been discussed here before, I searched the
>>>> mailing list and didn't find anything.
>>>>
>>>> I am beginning to use PyQT4 and I have run into some major headaches
>>>> trying to use QModelIndex. The problem stems from the fact that as
>>>> far as I can tell with the PyQT bindings it is not possible to attach
>>>> a reference to a python object to the index to then later be used by
>>>> data(), parent(), or any other methods.
>>>>
>>>> In C++ this is possible (and seems to be recommended usage) by using
>>>> the internalPointer() method of ModelIndex. This works for C++
>>>> because the internal pointer is stored as a void pointer that the
>>>> developer knows the true type of and they can just cast it to the
>>>> correct type to use it.
>>>>
>>>> Without this capability all use of QModelIndex in PyQT, when I use
>>>> TreeViews I have found myself contorting my data models quite a bit to
>>>> make things limp along. I am currently funneling all index lookups
>>>> through a manually maintained map from int id's to python objects. Is
>>>> this how other people are also working with QT4 models?
>>>>
>>>> I was surprised that there was no way (that I know of) to attach a
>>>> python object to a QModelIndex. It seems from the QT documentation
>>>> that this is the intent of how indexes are to be used in C++, but
>>>> there is no corresponding way to do this in Python.
>>>>
>>>> I was wondering though, would it be possible to expand the PyQT
>>>> bindings a bit and add two methods:
>>>>
>>>> QModelIndex.internalPyObj()
>>>> QAbstractItemModel.createIndexPy(int, int, pyobj)
>>>>
>>>> I think it could be implemented by casting from PyObject* to void*
>>>> behind the scenes and passing through to the existing
>>>> internalPointer() C++ interface. This would make working in Python
>>>> much easier while still preserving the intent of the QModelIndex
>>>> interface.
>>>>
>>>> Any comments? Am I missing some easy way to do this already?
>>> You are quite right, but there is no need to add new methods as the
>>> existing methods are useless in a Python context so they can be re-used.
>>>
>>> In tonight's snapshot both will accept/return Python objects rather than
>>> void *. You will still need to keep an external reference to any objects.
>>>
>>> Phil
>> Hi Phil,
>>
>> I really like that feature, however, there are some problems with it right
>> now: - it's impossible to use IDs instead of PyObject (unless one keeps a
>> reference to the int, which is rather clumsy), since everything is a
>> PyObject. Changing the order of the two createIndex(...) overloads remedies
>> this.
>
> Good point.
>
>> - internalPointer() sometimes returns an invalid object which crashes the
>> interpreter. I'm investigating this right now...
>
> Unless I've done something particularly stupid, that can only be because the
> object has been garbage collected.
Hi Phil,
the objects get collected, since *something* decreases the refcount which should
decrease it.
Please have a look at the attached example. The refcount of the Element objects
decreaes, though it should always be at least 3: 1 + reference in the
ElementTree structure + reference in _np.
Python is 2.4.3, sip4 and PyQt4 both from yesterday.
best,
Torsten
--
Torsten Marek <shlomme@gmx.net>
ID: A244C858 -- FP: 1902 0002 5DFC 856B F146 894C 7CC5 451E A244 C858
Keyserver: subkeys.pgp.net
["segfault.py" (application/x-python)]
["signature.asc" (application/pgp-signature)]
_______________________________________________
PyKDE mailing list PyKDE@mats.imk.fraunhofer.de
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic