[PyQt] QAbstractItemModel causes segfault
Sebastian Elsner
sebastianelsner at freenet.de
Thu Mar 25 09:03:41 GMT 2010
Hello,
I am using a QTreeView to display data coming from a sqlalchemy query. All
is fine for displaying, but when I add rows, which also adds records to
the database the "internal pointers", the QAbstractItemModel so heavily
depends on, suddenly point to nowhere, because they don't keep strong
references (crashing the interpreter). I am using the reference
implementation of the editable tree example, with the small adjustment
that instead of TreeItem my sqlalchemy class is used. So, at first it
seemed like the error was produced by sqlalchemy, but with the help of the
people on the other list I could verify, that its a problem of PyQt.
To quote Conor from the sqlalchemy list:
> I believe the real problem is that these "internal pointers" are not
> doing proper incref/decref on the python objects they point to, so your
> python objects are getting garbage collected prematurely. The
> expire-on-commit readily exposes this issue, but disabling it will not
> really fix the underlying problem.
> A newer version of pyQT may do the incref/decref for you. If not, your
> QAbstractItemModel-derived object should keep strong references to
> everything that was pointed to by an "internal pointer" in a private
> list or set. This should prevent them from being garbage collected.
I followed conors suggestion with the string reference list and it worked.
The objects are not garbage collected, the tree builds and extends
properly. Is there any pyqt developer, who can share his thoughts on this
and maybe help. I don't want to scream: BUG! but to Michael Bayer, the
creator of sqlalchemy this is one:
> if QT is maintaining a "reference" to something using its "memory
> address", but is not actually recording a strong reference to the object
> within the python interpreter, that sure sounds like a bug to me. It
> would imply that to use that library, every object you generate in Python
> must have a strong reference maintained, or QT now references invalid
> ids.
Thank you very much for helping
Sebastian
More information about the PyQt
mailing list