将 std::unique_ptr.get() 作为参数传递给 addWidget()
passing std::unique_ptr.get() as a parameter to addWidget()
我正在尝试将 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);
但是,如果我使用 plot2
的 std::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。
我正在尝试将 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);
但是,如果我使用 plot2
的 std::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。