问:子对象可以在父对象中组合吗?

Ton*_*ony 14 c++ qt qwidget qobject

在Qt中,我可以通过合成将子窗口小部件嵌入其父窗口中,还是必须创建它们new

class MyWindow : public QMainWindow
{
    ...
private:
    QPushButton myButton;
}

MyWindow::MyWindow ()
 : mybutton("Do Something", this)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

文档说任何派生的对象QObject在其父元素被销毁时会自动销毁; 这意味着调用delete,在上面的例子中会崩溃.

我必须使用以下内容吗?

QPushButton* myButton;

myButton = new QPushButton("Do Something", this);
Run Code Online (Sandbox Code Playgroud)

编辑

答案非常多样化,基本上归结为三种可能性:

  • 是的,组成是好的.Qt可以弄清楚对象是如何分配的,只有delete堆分配的对象(这是如何工作的?)
  • 是的,组合没问题,但是没有指定父级,因为父级会调用delete该对象(但是不会将无父小部件变成顶级窗口吗?)
  • ,小部件总是必须进行堆分配.

哪一个是正确的?

Cha*_*ngi 7

当特定对象的删除序列开始时,将删除非静态非堆成员变量.只有当所有成员都被删除时,它才会转到基类的析构函数.因此,在调用~QMainWindow()之前,将删除QPushButton myButton成员.并且从QObject文档:"如果我们在父对象之前删除子对象,Qt将自动从父对象的子列表中删除该对象".因此不会发生崩溃.


O.C*_*.C. 5

对象树和所有权回答了您的问题。基本上,当子对象在堆上创建时,它将被其父对象删除。

另一方面,当在堆栈上创建子对象时,销毁顺序很重要。子级将在其父级之前被销毁,并将其自身从其父级列表中删除,以便其析构函数不会被调用两次。

该链接中还有一个示例,显示了有问题的销毁顺序。