我有一个事件过滤器对象,安装方式如下:
someQObject.installEventFilter( new MyEventFilterObject() );
我需要确保在删除MyEventFilterObject
时释放someQObject
分配的内存。 QObject在删除时会发出任何事件吗?或者我怎么知道它已被删除并删除事件过滤器?
答案 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);
如果可以,只需在过滤器上设置父级即可。如果过滤器需要具有不同的父级,则按上述方式连接信号。
我怎么知道它已被删除并删除了事件过滤器?
您可以简单地将事件过滤器设为永久对象 - 每个线程只需要一个。一个事件过滤器可以根据需要安装在任意数量的对象上,只要它们都位于同一个线程中即可。除非事件过滤器是有状态的,否则你当然可以这样做,并且它的状态特定于它所过滤的对象。