[PyQt] Bug in QTableView.setModel()
Aaron Digulla
digulla at hepe.com
Mon Jan 7 10:12:10 GMT 2008
Quoting Andreas Pakulat <apaku at gmx.de>:
> 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/
More information about the PyQt
mailing list