[Development] parented_ptr
Daniel Schürmann
daschuer at mixxx.org
Sun Nov 2 19:34:40 CET 2025
Am 30.10.25 um 20:55 schrieb Volker Hilsheimer:
>
>> On 30 Oct 2025, at 18:20, Daniel Schürmann <daschuer at mixxx.org> wrote:
>>
>> 3: QObject::addChild(std::unique_ptr<QObject *> child)
>> Will this have a chance to being merged upstream?
>
> In principle, I don’t see a reason why this would not be acceptable.
>
> The devil is in the details; note that the following does not compile:
>
> QObject parent;
> QWidget widget;
> widget.setParent(&parent);
>
> as QWidget::setParent(QWidget *) shadows QObject::setParent(QObject
> *). The equivalent code using addChild
>
> QObject object;
> auto child = std::make_unique<QWidget>();
> object.addChild(std::move(child));
>
> should also not compile, as a QWidget must only have another widget as
> the parent.
>
> (and thinking about it, that’s also something to keep in mind for
> QObject::makeChildObject).
>
> And all of that without qobject.h being able to include qwidget.h…
> which might make this challenging.
>
> Volker
>
Hi Volker
I got wind of the devil's scheme, while implementing our plan.
All the discussed ideas of createChild() and addChild() needs in sub
calls, finally call the correct setParent() overload.
This depends on both, the parent and the child class type. C++ can
unfortunately not deduce the type of the "this" pointer in a base class
template.
This is however required to allow the simple form of:
parent.createChild<QObject>(); parent.addChild(std::move(pOther));
My first idea was to overload ceateChild() in QObject and QWidget, but
there are a couple of more setParent() overloads and potential other in
the user code. This IMHO qualifiers that approach.
the workaround is the rather ugly:
parent.createChild<QObject>(&parent);
Due to the redundant parent, which must be equal the code might be the
source of headaches, at least does not simplify the Qt usage what is
desired.
Conclusion: Let's add some free helper functions that allows the C++
Core Guideline semantics anyway.
I will prepare the following:
* QParentedPointer<Child>
* qCreateParented<Child>(args);
* qAddChild(parent, std::unique_ptr<Child>);
I will prepare a PR for this.
Best regards,
Daniel
More information about the Development
mailing list