如何删除相应的QObject时删除自身的事件过滤器?

时间:2016-02-02 12:23:22

标签: qt

我有一个事件过滤器对象,安装方式如下:

someQObject.installEventFilter( new MyEventFilterObject() );

我需要确保在删除MyEventFilterObject时释放someQObject分配的内存。 QObject在删除时会发出任何事件吗?或者我怎么知道它已被删除并删除事件过滤器?

1 个答案:

答案 0 :(得分:2)

  

我认为该层次结构仅适用于小部件。

对象所有权由QObject实施。 QWidget只是继承自QObject。事实上,QWidget有点特殊情况:它可以有QObject个孩子,但是can't have a parent that's not a QWidget

您需要做的就是将过滤器添加到它安装在的对象上:

someQObject.installEventFilter(new MyEventFilterObject(someQObject));
  

QObject在删除时会发出任何事件吗?

很难谈论发射事件的物体。事件在特定接收者处目标。事件的发件人必须了解收件人先验。事件可以随时通过任何代码发送到任何对象 - 甚至是在非Qt线程中运行的代码,而不是使用Qt功能的任何其他方面。如果是通用QObject,它可以向其父级和/或其子级发送一个事件,以及它的相关信息。否则,它不知道任何其他对象。

QObject会从其destuctor发出信号QObject::destroyed(QObject*)。发出该信号时,您可以让事件过滤器自行销毁:

QObject * chainDestroy(QObject * src, QObject * dst) {
  QObject::connect(src, &QObject::destroyed, dst, &QObject::deleteLater);
  return dst;
}
auto filter = chainDestroy(&someQObject, new MyEventFilterObject);
someQObject.installEventFilter(filter);

如果可以,只需在过滤器上设置父级即可。如果过滤器需要具有不同的父级,则按上述方式连接信号。

  

我怎么知道它已被删除并删除了事件过滤器?

您可以简单地将事件过滤器设为永久对象 - 每个线程只需要一个。一个事件过滤器可以根据需要安装在任意数量的对象上,只要它们都位于同一个线程中即可。除非事件过滤器是有状态的,否则你当然可以这样做,并且它的状态特定于它所过滤的对象。