将 std::unique_ptr.get() 作为参数传递给 addWidget()

passing std::unique_ptr.get() as a parameter to addWidget()

我正在尝试将 QWidget 指针参数 (plot2) 传递给 QtaddWidget(QWidget * T,...) 函数,该函数将指向 QWidget 的指针作为其第一个参数.如果我传递原始指针 plot2,我会按预期得到两个并排面板。

原始指针版本

    plot1 = new QWidget;
    plot2 = new QWidget;

    gridLayout = new QGridLayout(gridLayoutWidget);
    ...
    gridLayout->addWidget(plot1, 1, 1, 1, 1);
    gridLayout->addWidget(plot2.get(), 1, 2, 1, 1);

但是,如果我使用 plot2std::unique_ptr 版本并通过 std::unique_ptr(plot2) 传递指针,如下面的代码片段所示,与 [=15= 关联的面板] 在没有编译器提出任何投诉的情况下丢失。

智能指针版本

    plot1 = new QWidget;
    auto plot2 = std::unique_ptr<QWidget>(new QWidget);

    gridLayout = new QGridLayout(gridLayoutWidget);
    ...
    gridLayout->addWidget(plot1, 1, 1, 1, 1);
    gridLayout->addWidget(plot2.get(), 1, 2, 1, 1); // this panel goes missing

我试过使用 std::shared_ptr 但结果还是一样。

如果我 release()plot2 相关联的 std::unique_ptr 如下,当然有效,但据我所知,我失去了 [= 的智能指针版本的使用15=] 从今以后。

使用std::unique_ptr.release()

    plot1 = new QWidget;
    auto plot2 = std::unique_ptr<QWidget>(new QWidget);

    gridLayout = new QGridLayout(gridLayoutWidget);
    ...
    gridLayout->addWidget(plot1, 1, 1, 1, 1);
    gridLayout->addWidget(plot2.release(), 1, 2, 1, 1);

你能想出如何让它工作吗?

来自文档(强调我的):

Adds item at position row, column, spanning rowSpan rows and columnSpan columns, and aligns it according to alignment. If rowSpan and/or columnSpan is -1, then the item will extend to the bottom and/or right edge, respectively. The layout takes ownership of the item.

添加该小部件后,您不再拥有它,因此存储在 std::unique_ptr 中然后调用 release 是完全合理的。这实际上比原始指针版本更可取,就好像某些东西在你将它添加到布局之前抛出异常,内存将被自动回收。

 auto plot2 = std::unique_ptr<QWidget>(new QWidget);

您的 QWidget* 对象在 plot2 超出范围后被删除。 unique_ptr 析构函数中的原因是这样的

~unique_ptr() {delete ptr;}

并且当 QObject 被删除时,Qt 会删除与其关联的所有 gui。