[Qt4-preview-feedback] BUG: QGraphicsLayout::activate() does not work after the first time

Jan-Arve Sæther jasaethe at trolltech.com
Thu Feb 12 11:35:34 CET 2009


Hi Mihail,
Which preview version is this?
We should have fixed these problems for 4.5 now.
The fixes should at least be in the latest release candidate.

Jan-Arve

Mihail Naydenov wrote:
> It seams there are problems with QGraphicsLayout::activate()
> 
> Calling it (manually) simply does not work - setGeometry() is not called, as the docs say.
> After some debugging it became clear that when activate() is called, first its sets isActivated()
> to true, and thats fine:
> 
> bool QGraphicsLayout::isActivated () const
> Returns true if the layout is currently being activated; otherwise, returns false.
> If the layout is being activated, this means that it is currently in the process of rearranging its items
> (i.e., the activate() function has been called, and has not yet returned)
> 
> 
> ....the problem is - isActivated is never set back to false!
> Simple qDebug() for isActivated() from anywhere in the client code proofs that easily.
> 
> Looking into the code,
> the last command in activate() is:
> 
> // ### bug, should be parentItem ?
> parentLayoutItem()->updateGeometry(); // bubble up; will set activated to false
> 
> that's ok, but no implementation of updateGeometry() exist, that will set activated back to false!
> 
> Looking deeply into the code,
> the possible parents of the layout in question are:
> 
> QGraphicsLayoutItem - it only clears the sizehint cache
> 
> QGraphicsLayout - calls the above QGraphicsLayoutItem implementation and updateGeometry() for all of its parent layouts.
> If the parent is not a layout it calls invalidate() on itself... I don't pretend to know all the code at 100%, and maybe this invalidate is
> 
> meant to do the trick.... But this scenario is highly unlikely - it means the layout that calls activate() in the first place, has to have a parent layout (be part of another layout), which also has a parent that is not a layout !?! ...Hope I got this right...
> 
> 
> QGraphicsWidget - the most common scenario. It also calls the QGraphicsLayoutItem implementation and updateGeometry()
> for all of its parent layouts. If the parent is a widget, it posts LayoutRequest to it, and that it resize itself.
> 
> 
> Im by no means Qt expert, so I might be missing something, but this seams to be the picture...
> 
> Anyways, the reason Im worried is because without activate() there is no way to call any layout with cached values,
> even the existing Qt ones that do implement caching...
> One can allays use invalidate() instead, which sets activate to false, but also clears any cached layout geometry.
> 
> 
> Thank You
> MihailNaydenov
> 
> 
>       


-- 
Jan- Arve Sæther,
Trolltech ASA



More information about the Qt4-feedback mailing list