[PyQt] Bug in QTableView.setModel()

Aaron Digulla digulla at hepe.com
Tue Jan 8 08:03:55 GMT 2008


Quoting Andreas Pakulat <apaku at gmx.de>:

>> 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.
>
> No its not, the view doesn't take ownership of the model, neither in Qt
> C++ nor in PyQt, thats why your object is garbage collected. A reason
> for not taking ownership is that a model might be used in multiple
> views.

Incrementing the usage count != ownership. I'm the one who decides  
which object in my project "owns" the model. This is a design issue.

That the table doesn't say "please don't GC this because I still need  
it" has nothing to do with ownership. It's a usage counter bug.

Proof: If N tables access the model, the usage count will be N. As  
every table is GC'd, the usage count drops. When the last table is  
GC'd, the usage count will be 0 and the model will be GC'd, too. So  
there is no reason why a table must not increment the usage count.

But there are plenty of reasons why it should:

1. In Python, I expect all any every object to manage the ownership of  
anything I store in it. If it needs it beyond the time of the call  
where it sees the object for the first time, it must increment and  
decrement the usage counter accordingly. See  
http://docs.python.org/ext/refcounts.html

2. This bug doesn't produce deterministic errors. That makes it hard  
to locate and leads to the developer thinking "PyQt is unreliable" (in  
addition to the many wasted hours trying to find the bug).

3. It's simple to fix: In setModel(), you just have to check if there  
already is an old model. If so, check if it's a python object and  
decrement its usage count if it is. Then save the new pointer and  
increment its usage count if it's a python object.

4. The fix doesn't break anything.

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