2011-12-30 69 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被完全破壞之前發射」這樣的話來說。