[Interest] Taking back a widget from a QBoxLayout?

Jason H jhihn at gmx.com
Fri Feb 22 22:48:14 CET 2019



> Sent: Friday, February 22, 2019 at 4:29 PM
> From: "Giuseppe D'Angelo" <giuseppe.dangelo at kdab.com>
> To: "Jason H" <jhihn at gmx.com>
> Cc: interest at qt-project.org
> Subject: Re: [Interest] Taking back a widget from a QBoxLayout?
>
> Il 22/02/19 20:42, Jason H ha scritto:
> > '''
> > When you use a layout, you do not need to pass a parent when constructing the child widgets. The layout will automatically reparent the widgets (using QWidget::setParent()) so that they are children of the widget on which the layout is installed.
> > 
> > Note: Widgets in a layout are children of the widget on which the layout is installed, not of the layout itself. Widgets can only have other widgets as parent, not layouts.
> > '''
> 
> 
> This is the bulk of the story, and ultimately, what's interesting for you.
> 
> 
> > However:
> > '''
> > void QLayout::addItem(QLayoutItem *item)
> > Implemented in subclasses to add an item. How it is added is specific to each subclass.
> > 
> > This function is not usually called in application code. To add a widget to a layout, use the addWidget() function; to add a child layout, use the addLayout() function provided by the relevant QLayout subclass.
> > 
> > Note: The ownership of item is transferred to the layout, and it's the layout's responsibility to delete it.
> > 
> > void QLayout::addWidget(QWidget *w)
> > Adds widget w to this layout in a manner specific to the layout. This function uses addItem().
> > '''
> > 
> > So the docs are clear as mud. 
> 
> The docs are indeed unclear, but look at what you're quoting -- a 
> function to add QLayoutItems to a layout. A QWidget is NOT a QLayoutItem 
> (but it is possibly managed by one). QLayout::addItem will add a 
> QLayoutItem to a layout, passing ownership of the _item_ to the layout 
> (but not of the widget the layout item is managing).
> 
> 
> In other words, if you have a toplevel widget with two children (A and 
> B), managed by a layout, what you're going to build looks like this from 
> an ownership point of view:
> 
> 
> * QWidget (top)
> |
> +—— QWidget A
> |
> +—— QWidget B
> |
> \—— QBoxLayout
>      ¦
>      +-- QWidgetItem (managing A)
>      ¦
>      \-- QWidgetItem (managing B)
> 

I've been using Qt for 14 years and never noticed this. Wow! I always just thought it could manage the widget directly. 

> Solid lines represent ownership via QObject parent/child. Dashed lines 
> represent ownership via other means.
> 
> 
> > QLayout mentions "ownership" but the tips mention "parent". FWIW, I knew QWidgets parented QWidgets, but I don't know what it means by "ownership". 
> 
> They refer to the same thing.
> 
> A parent QObject owns (... has ownership of) its children QObjects, 
> meaning that deleting the parent will deleting the children as well.
> 
> Some object Foo acquiring ownership of Bar means that deleting Foo will 
> also delete Bar. This can happen through QObject parent/child, or some 
> other mechanism.

Take Aways:
1. The docs should be changed to use "parent" rather than ownership. Ownership is its own thing ( https://doc.qt.io/qt-5/qtqml-cppintegration-data.html#data-ownership )
2. The docs should elaborate on the implicit creation of the QLayoutItems that manage widgets. 
3. I learned something today.


Thanks for that clarification Giuseppe!




More information about the Interest mailing list