考虑这个测试用例:
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 被销毁之前立即发出,并且无法被阻止。”为什么会发生这种情况?
最佳答案
如果您考虑信号是如何发出的,它是由基本 QObject 完成的——这就是 QObject 知道它正在被销毁的方式。
因此,当派生类被销毁时,最派生的析构函数首先运行(根据标准 C++ dtor 处理),并显示 “MyObject destructor”
消息。当该 dtor 完成时,基础 dtor 开始运行,在本例中为 QObject dtor,然后发出信号并显示 “即将被销毁!”
消息。
您提到的文档中的措辞可能有点不准确。可能用类似“此信号在对象 obj 被销毁时发出”或“此信号在对象 obj 被完全销毁之前立即发出”这样的措辞更好。
关于c++ - 为什么在销毁后调用 QObject 销毁信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8683403/