消息关闭
    暂无新消息!

qt QObject的析构顺序。

问题作者 : 亮剑2017-07-07发布
qt 析构是先析构children再析构parent么?

【嵌入式】阿C 2017-7-5 15:42:40
代码:
#define myqd qDebug()<<QString("%1::%2").arg(this->metaObject()->className()).arg(__func__)<<__LINE__<<":"<<endl
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton *pb = new QPushButton(this);
    QPushButton *pb2 = new QPushButton(pb);
    connect(pb,&QPushButton::destroyed,this,&Widget::test);
    connect(pb2,&QPushButton::destroyed,this,&Widget::test);
    pb->setObjectName("button");
    pb2->setObjectName("button2");

    QTimer::singleShot(2000,pb,SLOT(deleteLater()));
}

void Widget::test(){
    myqd<<"destroy"<<sender()->objectName();
}


Widget::~Widget()
{
    myqd;
    delete ui;
    myqd;
}


输出:
"Widget::test" 25 : 
destroy "button" 
"Widget::test" 25 : 
destroy "button2" 
"Widget::~Widget" 31 : 

我看到的是先运行parent的析构函数,再析构childeren的析构函数啊

2个回答

︿ 1
这跟qt没有关系 如果一个成员指针的声明生命周期跟这个类一样长,你是不是在析构时释放这个指针,同理
︿ 0
必须先运行parent的析构函数才会去析构子窗口的析构函数啊。先运行父窗口的析构函数,在未退出析构函数的时候,运行子窗口的析构函数,等所有子窗口析构完毕后才退出父窗口的析构函数。