为什么Qt需要在堆中分配子对象?

yes*_*aaj 6 qt

class MyWidget : public QWidget { public:
    MyWidget( QWidget *parent=0, const char *name=0 ); };


MyWidget::MyWidget( QWidget *parent, const char *name )
        : QWidget( parent, name ) {
    QPushButton *quit = new QPushButton( "Quit", this, "quit" );
    quit->setGeometry( 62, 40, 75, 30 );
    quit->setFont( QFont( "Times", 18, QFont::Bold ) ); 
} 
Run Code Online (Sandbox Code Playgroud)

在上面的代码quit是在Heap中分配的,因为它是MyWidget的子代,所以它是必需的

为什么Qt需要在堆中分配子对象?

mxc*_*xcl 5

在您的示例中,quit不必是堆分配的.

此代码编译并执行正常:

struct MyWidget : QWidget 
{
    QPushButton quit;

    MyWidget()
    {
        quit.setGeometry( 62, 40, 75, 30 );
        quit.setFont( QFont( "Times", 18, QFont::Bold ) );
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 如果你将MyWidget作为父节点添加到退出按钮,它也有效(我认为这更有趣).该按钮在MyWidget之前被销毁,因此在MyWidget被销毁之前被取消. (4认同)

ypn*_*nos 0

我认为这里的想法是 Qt 对大多数对象都有自己的内部引用计数,如果你传递它们,则使用写时复制等。

你的问题能说得更具体一些吗?