[Development] unique_ptr and Qt, Take 2

Konstantin Ritt ritt.ks at gmail.com
Fri May 3 21:25:29 CEST 2019


Just wandering, what `QObject:: children ()` shall return? ;p


Konstantin

пт, 3 мая 2019 г., 22:09 Konstantin Ritt <ritt.ks at gmail.com>:

> Ivan,
>
> note that observer_ptr is mostly like
>
> template<typename T>using observer_ptr = T*;
>
>
> so what about
>
>
> layout2->addWidget(layout->addWidget(make_unique<QPushButton>("right")))->setFlat(true);
>
> ?
>
>
> Regards,
> Konstantin
>
>
> пт, 3 мая 2019 г., 21:41 Иван Комиссаров <abbapoh at gmail.com>:
>
>> Thiago, can you please elaborate how you see this?
>>
>> For a simple TreeItem a pair of std::unique_ptr/std::observer_ptr should
>> be enough (with a bunch of convenience methods to insert children):
>>
>> struct TreeItem
>> {
>>    observer_ptr<TreeItem> parent;
>>    vector<unique_ptr<TreeItem>> children;
>> };
>>
>> Yes, the code becomes a bit verbose, but the ownership transfer is now
>> visible with those (ugly) std::moves.
>>
>> I can think of an alternative of using shared pointers (since we already
>> have a QPointer aka WeakPointer<QObject>) but I think it gives too much
>> overhead just to support corner cases.
>>
>> If QLayout::addWidget() will return an observer_ptr*, you can just do
>>
>> auto button = layout->addWidget(make_unique<QPushButton>(«RIGHT»));
>> button->setFlat(true);
>>
>> * ok, you need a template version of addWidget for that, but since c++ is
>> all about templates these days it doesn’t really a disadvantage
>>
>>
>> > 3 мая 2019 г., в 20:24, Thiago Macieira <thiago.macieira at intel.com>
>> написал(а):
>> >
>> > On Friday, 3 May 2019 10:22:20 PDT Daniel Teske wrote:
>> >> std::unique_ptr<QPushButton> rightButton =
>> >> std::make_unique<QPushButton>("RIGHT");
>> >> layout->addWidget(std::move(rightButton));
>> >
>> > The problem in this particular example is that once you've added the
>> widget,
>> > the rightButton smart pointer no longer has a pointer. You can't
>> continue to
>> > set up your push button. In most cases, this is just a matter of moving
>> the
>> > set up before the addition / reparenting, or using the other idiom
>> where the
>> > object is never in a smart pointer in the first place.
>> >
>> > So this begs the question of whether std::unique_ptr is the best smart
>> pointer
>> > for this scenario. Would it make sense to create one that understands
>> parent-
>> > child relationship?
>> >
>> > --
>> > Thiago Macieira - thiago.macieira (AT) intel.com
>> >  Software Architect - Intel System Software Products
>> >
>> >
>> >
>> > _______________________________________________
>> > Development mailing list
>> > Development at qt-project.org
>> > https://lists.qt-project.org/listinfo/development
>>
>> _______________________________________________
>> Development mailing list
>> Development at qt-project.org
>> https://lists.qt-project.org/listinfo/development
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20190503/c6fbe23b/attachment-0001.html>


More information about the Development mailing list