<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>
    </p>
    <div class="moz-text-flowed" style="font-family: -moz-fixed;
      font-size: 14px;" lang="x-unicode">Hi,
      <br>
      <br>
      a year back I wrote a patch that added unique_ptr apis to most of
      qtbase. I still think that would be a good addition to Qt, and
      thus I've updated the patch with the feedback gained at the
      Contributor Summit last year and taking into account that with
      Qt6, binary compatibility is not required. The result is: <a
        class="moz-txt-link-freetext"
        href="https://codereview.qt-project.org/#/c/260618/">https://codereview.qt-project.org/#/c/260618/</a>
      <br>
      <br>
      Since not everyone remembers last years mail, I'll explain the
      problem that patch is trying to solve, but won't go into all the
      details:
      <br>
      Consider this small program:
      <br>
      <br>
      QWidget widget;
      <br>
      QHBoxLayout *layout = new QHBoxLayout(&widget);
      <br>
      QPushButton *leftButton = new QPushButton("LEFT", &widget); //
      Owned by widget
      <br>
      layout->addWidget(leftButton); // No Ownership transfer
      <br>
      <br>
      QPushButton* rightButton = new QPushButton("RIGHT"); // No owner
      <br>
      layout->addWidget(rightButton);   // Ownership transfer
      <br>
      <br>
      QObject::connect(leftButton, &QPushButton::clicked,
      <br>
              [leftButton]{
      <br>
          QMenu menu;
      <br>
          auto act = new QAction("Action!"); // No Owner
      <br>
          menu.addAction(act); // No Ownership transfer
      <br>
menu.exec(leftButton->mapToGlobal(leftButton->rect().bottomLeft()));
      <br>
      });
      <br>
      widget.show();
      <br>
      <br>
      In that program:
      <br>
      <br>
      * The left button is owned at construction by the parent.
      <br>
      * The right button is created unowned, but adding a widget to a
      layout automatically sets the parent
      <br>
      * The action is created unowned, and is leaked because addAction
      does not set the parent.
      <br>
      <br>
      That is, even though:
      <br>
      <br>
      * layout->addWidget(new QPushButton()) and
      <br>
      * menu->addAction(new QAction())
      <br>
      <br>
      look very similar, the later leaks memory.
      <br>
      <br>
      That's a less than ideal api. With Qt6 there's a opportunity to
      leverage unique_ptr to ensure that memory is not leaked.
      <br>
      <br>
      The patch adds two ways to create new QObjects:
      <br>
      <br>
      * std::make_unique<QPushButton>("LEFT"); and
      <br>
      * parent->makeChild<QPushButton>("RIGHT");
      <br>
      * adds various overloads for ownership transfer
      <br>
      <br>
      The first half of the program would thus look like:
      <br>
      <br>
      QWidget widget;
      <br>
      QHBoxLayout *layout = widget.makeChild<QHBoxLayout>();
      <br>
      <br>
      QPushButton *leftButton =
      widget.makeChild<QPushButton>("LEFT");
      <br>
      layout->addWidget(leftButton);
      <br>
      <br>
      std::unique_ptr<QPushButton> rightButton =
      std::make_unique<QPushButton>("RIGHT");
      <br>
      layout->addWidget(std::move(rightButton));
      <br>
      <br>
      For second half, the naive transformation:
      <br>
      <br>
      {
      <br>
          QMenu menu;
      <br>
          auto act = std::make_unique<QAction>("Action!");
      <br>
          menu.addAction(act.get());
      <br>
menu.exec(leftButton->mapToGlobal(leftButton->rect().bottomLeft()));
      <br>
      }
      <br>
      <br>
      does no longer leak memory, instead the action is freed at the end
      of the scope as its still owned by the unique_ptr.
      <br>
      <br>
      I believe that Qt6 is a unique opportunity to add apis for better
      memory management to Qt.
      <br>
      <br>
      So, who thinks that this is something that ought to be a Qt6
      feature?
      <br>
      <br>
      And who wants to actually help make that happen?
      <br>
      <br>
      daniel
      <br>
      <br>
    </div>
  </body>
</html>