Quoting Andreas Pakulat <[EMAIL PROTECTED]>:

On 06.01.08 21:13:44, Aaron Digulla wrote:
The root cause is that setModel() doesn't increment the usage counter of
the python class passed in, so Python will GC it if I don't save a
pointer elsewhere.

Thats by purpose. One reason I can think of is that you often want to
use the model elsewhere to insert data or do something with the data and
then you often don't want a QAbstractItemModel instance but your
specific subclass.

I'm talking about preventing the python class which is used as the model being garbage collected; it doesn't matter from which Qt class it is derived.

As it is, the class pointer is copied into the view class and then python frees the memory. That causes spurious display errors and crashes. No matter how you look at it, that's a bug.

I found another one but I'm not sure it can be fixed: Create a XML handler which derives from QXmlDefaultHandler and override startElement() like so:

    def __init__(self):
        ...
        self.path = []

    def startElement(self, namespaceURI, localName, qName, atts):
        self.path.append(qName)

If you use qName later, the memory will have been freed (because Qt only gives you a read-only copy). Actually, if Qt was reusing that QString, the value could even change unexpectedly.

The workaround is to use self.path.append(unicode(qName)) to create a python string but that's error prone.

Regards,

--
Aaron "Optimizer" Digulla a.k.a. Philmann Dark
"It's not the universe that's limited, it's our imagination.
Follow me and I'll show you something beyond the limits."
http://www.pdark.de/

_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to