About deleting, removing widgets and layouts in Qt 4 -
(i use qt 4.7, windows 7, 64bit).
i created custom table. each row horizontal layout widgets. rows kept in qlist easy access, , children too. rows added inside parent widget.
if resize parent widget, calculate new sizes, delete everything, , recreate again.
my problem don't want delete widget. when clear table, it.
since have widgets inside qlist , inside parent layouts, how can remove widgets in each row, delete layouts, , add new layouts?
if do: takeat(0) every element inside each layout have qlayoutitem widget inside... how can delete layoutitem without deleting widget?.... how remove widget without killing it, no matter if it's in parent or child? because there many methods deleting: removeitem, removewidget... in layout, not takewidget... takeat() , gives qlayoutitem.
i tried several ways, still see widgets no matter happened them.
questions this:
when widget deleted? if takewidget(index) layout, deleted time itself? happen if have pointer in list?
removeat(index) execute delete method of widget?
ok. got working. let me explain how removing, keeping widgets works.
a widget known it´s parent layout. , remove through layout. doing:
layout()->removeat(widget); delete widget;
if use takeat(index) in qlayout (or it´s children), gives qlayoutitem. access widget inside, use widget(). there's no way remove widget without deleting it. approach non valid.
in docs tells way delete elements:
qlayoutitem *child; while ((child = layout->takeat(0)) != 0) { ... delete child; }
a special thing note in qt following: if have hyerarchy tree of layouts, added addlayout() inside layouts, no matter how deep widget inserted, you can remove child layouts or of parent layouts, if tree path layout , item built child layouts.
the easiest thing keep list of pointers items, in custom table. when clearing table reconstruct it, inside widget:
customtableitem* item; while ( !items_.isempty() && ( (item = items_.takefirst()) != 0 ) ){ layout()->removewidget(item); delete item; // works no matter item } items_.clear(); // clear list afterwards.
and works perfectly, updates layout itself. if want keep elements, skip "delete item;" , use them afterwards.
an important thing note different "remove" functions work differently (as understand on qt docs) in qlist or similar widgets, , in qlayout. in qlist, removeat removes object.
(qt 4.7 qlist docs)"removes item @ index position i. must valid index position in list (i.e., 0 <= < size())."
in qlayout, removewidget or removeitem don't remove item/widget, have responsability delete it, did before.
(qt 4.7 qlayout docs) "removes widget widget layout. after call, caller's responsibility give widget reasonable geometry or put widget layout."
hope helps. if see error, tell me , edit answer!.
more on deleting here: other stackoverflow post
Comments
Post a Comment