为什么 qobject_cast 和 dynamic_cast 在连接到 QWidget::destroyed 的插槽中失败?

ada*_*ker 2 qt casting qobject

我有一个子类,从 QObject 子类化。我想知道item什么时候被删除,所以我把这个槽连接到了子类继承的QWidget::destroyed()信号。但是当我尝试使用 qobject_cast 将参数转换为时,我得到零结果。从 C++ 的 dynamic_cast 获得相同的结果。为什么?

void MyClass::mySlot( QObject * item )
{
    qobject_cast<Subclass*>(item); // returns zero, even though item is a Subclass*
}
Run Code Online (Sandbox Code Playgroud)

ada*_*ker 5

原因是在发出 QObject::destroyed() 时,您的派生类 Subclass 已经被销毁。这是由C++ 销毁顺序暗示的。此外,这个问题涉及类似的问题。

为了解决这个问题,您可以使用 C 风格的指针转换(这是不推荐的),或者重写您的代码以使用 QObject。