[PyQt] TypeError thrown by rowsAboutToBeRemoved() when deleting a row from a QAbstractTableModel

Simon Hibbs simon.hibbs at gmail.com
Thu Jul 15 14:27:44 BST 2010


I'm an idiot.

It wasn't the rowsAboutToBeRemoved method of the model that was the
problem. It was the rowsAboutToBeRemoved method in one of my
QAbstractItemView subclasses. I was missing the 'self' reference in
the arguments lists.

Duh!

Oh boy, did that take some tracking down. If I'd had an indication of
which class the object having the problem belonged to, that would have
been a huge help. Any ideas how I could determine that?

Simon

On 14 July 2010 08:25, Simon Hibbs <simon.hibbs at gmail.com> wrote:
> The method implementation looks like this:
>
> def removeRows(self, position, rows=1, index=QModelIndex()):
>     # problem on next line, which raises rowsAboutToBeRemoved signal
>     self.beginRemoveRows(QModelIndex(), position, position + rows - 1)
>     self.units = self.units[:position] + \
>                  self.units[position + rows:]
>     self.endRemoveRows()
>     self.dirty = True
>     return True
>
> The error is:
>
> TypeError: rowsAboutToBeRemoved() takes exactly 3 arguments (4 given)
>
> The code is identical to the example in the Rapid GUI Programming
> book. In fact the example code from the book I downloaded works and
> mine doesn't on the same box, but I can't for the life of me see why.
> I have also upgraded from PyQt 4.6.1 to 4.7.4 and still have the
> problem.
>
> I think I can guess what is happening. Python adds an implicit self
> reference as the first argument to any method call, hence 4 arguments
> not three, but rowsAboutToBeRemoved lives in C++ land so doesn't know
> what to do with the self reference. However how come the example code
> works and mine doesn't? I know you can't answer that, but has anyone
> seen anything like this before? Any debugging tricks I can use to get
> more information on the problem? If I print the beginRemoveRows
> arguments there are only 3 of them, a QModelIndex object reference and
> two integers.
>
> I suppose if the beginRemoveRows invocation is correct, and I'm sure
> it is, it must be something to do with argument passing between PyQt
> and C++. There's a note in the Riverbank docs for QAbstractItemModel
> constructor that says:
>
> "The parent argument, if not None, causes self to be owned by Qt
> instead of PyQt."
>
> I tried setting parent=None but the book example code doesn't do that
> and it didn't make any difference anyway. Is there anything I can do,
> any instrumentation I can put into the app that might give more info
> on the issue?
>
> Best regards,
>
> Simon Hibbs
>


More information about the PyQt mailing list