Qt中如何为parent声明child是共享指针

How to declare for the parent that the child is a shared pointer in Qt

我有一个 class 声明如下:

class GuiImpl : public Gui
              , protected QScrollArea
{
public:
    typedef QScrollArea Base;

public:
    GuiImpl (QWidget *parent)
    : Base(parent)
    , view(0)
    {
    }

    ~GuiImpl () {  }

此 class 是 QScrollArea 的子项,该对象将被父项删除。问题是我将对象存储在 std::shared_ptr 中,所以当父级删除对象时,计数器不会减少并且共享指针之后会再次尝试删除对象,这会导致我的错误代码。

有没有办法将子对象声明为父对象的 shared_ptr,以便父对象在引用计数器为零时删除对象?

您可以在父级的析构函数中分离子级:

class Parent
{
  // ... Any your code
  QSharedPointer< QObject > child;

  ~Parent()
  {
    child->setParent(nullptr);
  }
};

但这很丑陋。相反,您不应该使用共享指针,正如@molbbdilo 在评论中所写的那样。如果你不喜欢原始指针,你可以使用 QPointer 包装器。