pyqt4 Table Widget deleting c/c++ object

Andrew andrewt.herd at gmail.com
Tue Oct 26 14:45:39 EDT 2010


On Oct 19, 2:29 pm, David Boddie <da... at boddie.org.uk> wrote:
> On Monday 18 October 2010 23:26, Andrew wrote:
>
> > I have two issues dealing with the table widget, though they may be
> > interconnected. I'm not sure. Both delete the cell widgets off of my
> > table but leave the rows, and then when I have the table update, it
> > complains the c++ object has been deleted.
>
> > # self.tableData.setCellWidget(rowCount, 0, trackItem)
> > # RuntimeError: underlying C/C++ object has been deleted
>
> This is because you pass your widgets to this method and later ask
> the table to clear the contents of the table. When it does so, it
> deletes the underlying widgets, leaving only Python wrappers.
>
> The documentation mentions that the table takes ownership of the
> widget:
>
> http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qtablewidg...
>
>
I had read that, but I did not fully understand what that actually was
supposed to mean. like a 'Ok it has ownership, good for it?' I hadn't
run into such a problem before either in any form. Now I know.

>
> > I have a list of a custom widget class that keeps track of several
> > directories. Each class gets put into a row on the table. I have a set
> > of radio buttons that will show me different views of the data: All,
> > New, Done, Errors, Warnings.
> > When I switch views, I clear my table, set the row count to 0, and
> > then add back in only the widgets I want to see.
>
> > Error 1:
> > I load in the data initially, and then repopulate the table, and then
> > re-size the window, instantly all listed rows are cleared, but the
> > rows stay. This only happened on the diagonal re-size (bottom left
> > corner); not the up and down, or side to side re-size. Attempting to
> > repopulate the table, resulted in: underlying C/C++ object has been
> > deleted. Though it will put in the correct number of rows required.
>
> > Everything worked fine as long as I did not re-size the window.
>
> This may only be a symptom of the behaviour and not a guarantee that
> the code was working correctly up until the point when the resize
> occurred.
>
> > Error 2:
> > I load in the data initially, and then repopulate the table, the table
> > clears and then nothing happens. No error messages or even visible
> > rows. After several more repopulates it with either crash or tell me:
> > underlying C/C++ object has been deleted.
>
> > I had error 1 two days ago, then without changing the code, I now get
> > error 2. I do not have to re-size the window for it to break now.
>
> I recommend that you create a list of non-widget data structures in
> your parsePath() method and create widgets on the fly in your addToTable()
> method. If you need to retain information when you repopulate the table
> then update the data structures that correspond to the widgets just before
> you clear the table.
>
> David

Thanks, it does work now that I've split it into a data and widget
class and create the widgets on the fly. Thanks for the help and sorry
for the delayed response.

Andrew



More information about the Python-list mailing list