[PyQt] Re: problem with QAbstractItemModel

Baz Walter bazwal at ftml.net
Fri Nov 6 19:00:52 GMT 2009

Vicent Mas wrote:
>> On Fri, 6 Nov 2009 10:22:59 +0100, Vicent Mas <uvemas at gmail.com> wrote:
>>>> Hi,
>>>> the attached script implements a minimal tree model featuring rows
>>>>  deletion. It works just fine with (Qt 4.4, PyQt 4.4.4). However, with
>>>>  (Qt
>>>>  4.5.2, PyQt 4.5.4) and (Qt 4.5.2, PyQt 4.6.1) deleting the last row
>>>>  raises
>>>>  the following error:
>>>> vmas at rachael:/tmp$ python tmTester.py &
>>>> [2] 6819
>>>> vmas at rachael:/tmp$ Traceback (most recent call last):
>>>>   File "tmTester.py", line 189, in index
>>>>     return self.createIndex(row, column, branch.childAtRow(row))
>>>>   File "tmTester.py", line 86, in childAtRow
>>>>     return self.children[row]
>>>> IndexError: list index out of range
>>>> Is it a bug in the recent versions of PyQt? Or should I fix some problem
>>>> in
>>>>  the script?
>>>> I would really appreciate your help.
>>> Hi,
>>> I'm still struggling with this problem, looking for a solution (or, at
>>> least,
>>> a workaround) with no luck. Could somebody give me a hand please? I
>> really
>>> need to fix this issue.
> Hi,
>> Try and simplify your test case. 250+ lines isn't something people can take
>> a quick look at.
> Done. I've removed as much as I can. Please, let me know if it is not yet 
> enough.
> Vicent
> PS: when running the script, in order to remove an item select it an press 
> Del.

your implementation of QAbstractItemModel.index is going to get called 
*a lot* and in many unforseen ways. i think a more sane implementation 
would be something like this:

     def index(self, row, column, parent):
         if self.hasIndex(row, column, parent):
             branch = self.nodeFromIndex(parent)
             return self.createIndex(row, column, branch.childAtRow(row))
         return QModelIndex()

this fixes your immediate bug, and will probably avoid many others.

More information about the PyQt mailing list