解构从QObject继承的类的对象

时间:2011-02-24 15:49:48

标签: c++ memory-management qt4

我有一个继承自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会尝试使用它并稍后释放它。

3 个答案:

答案 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&)吗?这是典型的设计。