我有一个继承自QObject的类,它会覆盖eventFilter()方法。它看起来像这样:
struct A
{
void DoSomething()
{
}
};
struct B : public QObject
{
Q_OBJECT
B( QObject *parent, A &a_ ) ) : QObject( parent ), a( a_ )
{
}
bool eventFilter( QObject * watched, QEvent * event )
{
if ( QEvent::FocusOut == event->type() )
{
a.DoSomething();
return true;
}
return QObject::eventFilter( watched, event );
}
A &a;
};
这只是简化的例子。现在在我的代码中,类型A的对象(传递给类型B的对象的构造函数)在qt开始销毁从QObject继承的对象之前被销毁。
有没有办法告诉qt之前释放类型B的对象?我不能简单地删除它,因为qt会尝试使用它并稍后释放它。
答案 0 :(得分:1)
由于B是一个事件过滤器,您需要找到它所过滤的对象(或多个对象)并将其从这些对象中删除。此时,您应该能够毫无问题地删除B.当删除QObject派生类时,Qt会停止跟踪它,并且以后不会尝试删除它。
答案 1 :(得分:0)
当对象B
需要A
生存时,如果它可以保持活着,即管理它的生命周期(直接或通过共享指针),那将是公平的。如果A
本身是QObject
,您可以使用Qt的object trees概念自动管理它。如果不是,您可以创建一个单独的QObject来管理A
的生命周期并使其成为B
的孩子。
答案 2 :(得分:0)
你确定这是特定于Qt的吗?看起来您在类中存储对A对象的引用,而不是在构造函数中复制A.这通常是问题的根源。
你难道不能将传递的A复制到内部A(不是A&)吗?这是典型的设计。