mar*_*ing 1 c++ qt stl smart-pointers c++11
我想传递一个QWidget指针参数(plot2)到Qt的addWidget(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)
你能弄清楚如何使这个工作吗?
从文档(强调我的):
在位置行,列,跨越rowSpan行和columnSpan列添加项目,并根据对齐方式对齐.如果rowSpan和/或columnSpan为-1,则项目将分别延伸到底部和/或右边缘.布局取得物品的所有权.
当您添加该窗口小部件时,您不再拥有它,因此存储在std::unique_ptr随后的调用中release是完全合理的.这实际上比原始指针版本更好,就像在将某个异常添加到布局之前抛出异常一样,内存将自动回收.
| 归档时间: |
|
| 查看次数: |
342 次 |
| 最近记录: |