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 <[EMAIL PROTECTED]> ID: A244C858 -- FP: 1902 0002 5DFC 856B F146 894C 7CC5 451E A244 C858 Keyserver: subkeys.pgp.net
segfault.py
Description: application/python
signature.asc
Description: OpenPGP digital signature
_______________________________________________ PyKDE mailing list [email protected] http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
