【问题标题】:passing std::unique_ptr.get() as a parameter to addWidget()将 std::unique_ptr.get() 作为参数传递给 addWidget()
【发布时间】:2015-05-27 12:49:21
【问题描述】:

我正在尝试将 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) 传递指针,如下面的sn-p 所示,则与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

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

当然,如果我 release() std::unique_ptrplot2 关联如下,但据我了解,我从此不再使用智能指针版本的 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);

你能弄清楚如何让它工作吗?

【问题讨论】:

    标签: c++ qt c++11 stl smart-pointers


    【解决方案1】:

    来自文档(重点是我的):

    在位置row、column、spanning rowSpan行和columnSpan列添加item,并根据对齐方式对齐。如果 rowSpan 和/或 columnSpan 为 -1,则项目将分别延伸到底部和/或右侧边缘。 布局拥有项目的所有权

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

    【讨论】:

    • 哇!那是一个闪电般的快速反应。这是有道理的,感谢您的澄清。如果想在代码的后续部分(但在同一范围内)使用plot2 怎么办?
    • 您可以存储对指针的引用,但最好进行重组,以便在将 plot2 添加到布局后不需要它。
    【解决方案2】:
     auto plot2 = std::unique_ptr<QWidget>(new QWidget);
    

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

    ~unique_ptr() {delete ptr;}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 2016-03-31
      • 2019-11-27
      相关资源
      最近更新 更多