Hi everybody, hi Phil, Op den Dunnersdag 28 Oktober 2010 Klock 14:28:16 hett Hans Meine schreven: > I am about to give up now, but first I want to post my current code again; > I added some assertions which show an interesting fact which I have no > explanation for: One assertion fails, since I am getting a QModelIndex of > my proxy model in which internalPointer does *not* contain a QModelIndex > of the proxied model anymore, but NULL/None. > > This is very strange, and with persistent QMIs, it crashes completely.
(I think) I now have a good explanation for this, and I would propose to add something like this to the docs, i.e. to http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html > Maybe it is a bug/limitation of PyQt, and QMI's internalPointer() does not > increment the refcount? That would explain a lot... This is exactly the case: Since QModelIndex does not derive from QObject, and it just carries a void* as internalPointer(), it is not possible to offer proper reference counting in PyQt. Any pointer that would directly or indirectly be installed in the internalPointer() could be copied or deleted an uncontrollable number of times on the C++ library side, without PyQt having any chance to notice. That means, that *one must only pass objects to createIndex() whose lifetime is longer than that of the model indices*. This is completely independent of the use of QPersistentModelIndex or any particular model subclasses offered by Qt; as long as you pass references to objects to createIndex() and later access them via internalPointer(), you need to make sure that they are not garbage collected in the meantime. (A common example would be to pass e.g. QObjects with a parent in an existing object hierarchy.) Hoping that this helps others coming after me, Hans _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt