[Development] unique_ptr and Qt, Take 2

Giuseppe D'Angelo giuseppe.dangelo at kdab.com
Fri May 3 21:04:40 CEST 2019


Hi,

Il 03/05/19 19:22, Daniel Teske ha scritto:
> The first half of the program would thus look like:
> 
> QWidget widget;
> QHBoxLayout *layout = widget.makeChild<QHBoxLayout>();
> 
> QPushButton *leftButton = widget.makeChild<QPushButton>("LEFT");
> layout->addWidget(leftButton);
> 
> std::unique_ptr<QPushButton> rightButton = 
> std::make_unique<QPushButton>("RIGHT");
> layout->addWidget(std::move(rightButton));

To really, really, really nitpick, this last line is (or feels) wrong: 
layouts do not take ownership of the widgets they manage. An ownership 
transfer MAY happen immediately (if the layout is installed) or later 
(as soon as the layout is installed).

> 
> For second half, the naive transformation:
> 
> {
>      QMenu menu;
>      auto act = std::make_unique<QAction>("Action!");
>      menu.addAction(act.get());
> menu.exec(leftButton->mapToGlobal(leftButton->rect().bottomLeft()));
> }
> 
> does no longer leak memory, instead the action is freed at the end of 
> the scope as its still owned by the unique_ptr.

Well, the super-naive transformation is actually already available:

> menu.addAction("Action!");

which correctly returns an action parented to the menu.


Anyhow, I too feel that we may need a dedicated smart pointer class for 
this, to catch all the corner cases and allow the existing flow of

1) create something
2) (re)parent it
3) keep using that something via a non-owning pointer.

My 2 c,
-- 
Giuseppe D'Angelo | giuseppe.dangelo at kdab.com | Senior Software Engineer
KDAB (France) S.A.S., a KDAB Group company
Tel. France +33 (0)4 90 84 08 53, http://www.kdab.com
KDAB - The Qt, C++ and OpenGL Experts

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4329 bytes
Desc: Firma crittografica S/MIME
URL: <http://lists.qt-project.org/pipermail/development/attachments/20190503/a7527dab/attachment-0001.bin>


More information about the Development mailing list