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

mar*_*ing 1 c++ qt stl smart-pointers c++11

我想传递一个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);
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用std::unique_ptr版本plot2并通过std :: unique_ptr(plot2)传递指针,如下面的代码片段所示,则相关的面板plot2会丢失,而编译器不会提出任何投诉.

智能指针版

    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
Run Code Online (Sandbox Code Playgroud)

我尝试使用过std::shared_ptr但结果仍然相同.

什么的作品当然是,如果我release()std::unique_ptr关联plot2如下,但后来我的理解我失去了使用的智能指针版本plot2今后.

使用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);
Run Code Online (Sandbox Code Playgroud)

你能弄清楚如何使这个工作吗?

Tar*_*ama 6

从文档(强调我的):

在位置行,列,跨越rowSpan行和columnSpan列添加项目,并根据对齐方式对齐.如果rowSpan和/或columnSpan为-1,则项目将分别延伸到底部和/或右边缘.布局取得物品的所有权.

当您添加该窗口小部件时,您不再拥有它,因此存储在std::unique_ptr随后的调用中release是完全合理的.这实际上比原始指针版本更好,就像在将某个异常添加到布局之前抛出异常一样,内存将自动回收.