2011-12-30 45 views
6

考虑这个测试用例:为什么QObject销毁称为AFTER销毁的信号?

class MyObject : public QObject 
{ 
    Q_OBJECT 
public: 
    MyObject() { qDebug() << "MyObject constructor"; } 
    virtual ~MyObject() { qDebug() << "MyObject destructor"; } 
}; 

class Tracker : public QObject 
{ 
    Q_OBJECT 
public: 
    Tracker() {} 

public slots: 
    void onDestructor() { qDebug() << "About to be destroyed!"; } 
}; 

int main(int argc, char** argv) 
{ 
    QCoreApplication app(argc, argv); 

    Tracker tracker; 

    MyObject *obj = new MyObject(); 
    QObject::connect(obj, SIGNAL(destroyed()), &tracker, SLOT(onDestructor())); 
    delete obj; 

    return app.exec(); 
} 

它打印这样的:

MyObject constructor 
MyObject destructor 
About to be destroyed! 

此行为违背Qt文档:“,这个信号被立即发出之前obj对象被破坏,并能不被阻止。“这是为什么发生?

回答

16

如果你考虑如何发出信号,它是由基本的QObject完成的 - 这就是QObject知道它被销毁的方式。

因此,当派生类被销毁时,最派生的析构函数会首先运行(按照标准C++ dtor处理),并显示"MyObject destructor"消息。当这个dtor完成时,基础dtors会运行,在这种情况下,它就是QObject dtor,然后它发出信号并显示消息"About to be destroyed!"

您提到的文档中的措词可能有点不准确。最好用类似“这个信号是在物体obj被破坏时发射”或“这个信号在物体obj被完全破坏之前发射”这样的话来说。