为什么它在函数中使用d->eventFilters.prepend(obj) not append(obj) in function(QObject::installEventFilter)



为什么它在函数(QObject::installEventFilter(中使用d->eventFilters.prepend(obj)而不是append(obj(,我想知道为什么要以这种方式设计它。我只是好奇而已。

void QObject::installEventFilter(QObject *obj)
{
Q_D(QObject);
if (!obj)
return;
if (d->threadData != obj->d_func()->threadData) {
qWarning("QObject::installEventFilter(): Cannot filter events for objects in a different thread.");
return;
}
// clean up unused items in the list
d->eventFilters.removeAll((QObject*)0);
d->eventFilters.removeAll(obj);
d->eventFilters.prepend(obj);
}

这样做是因为要首先处理最近安装的事件过滤器,即它需要位于过滤器列表的开头。通过按从begin()end()的顺序遍历列表来调用筛选器。

最近安装的过滤器将首先处理,因为只有两个简单的选择是先处理它或最后处理它。第二个选择没有用:当你过滤事件时,你想在其他人之前决定会发生什么。好吧,但是一些新用户的过滤器会先于您的过滤器,那怎么可能呢?如下所示:事件过滤器用于修改功能 - 已经存在的功能。如果您在现有功能中的某个位置添加了一个过滤器,您将有效地连接到具有未知行为的部分定义的系统。毕竟,即使是Qt的实现也使用事件过滤器。它们提供记录的行为。通过最后插入事件过滤器,您根本无法确定它会看到哪些事件 - 这完全取决于过滤器上方每一层功能的实现细节。

安装了某些事件过滤器的系统就像洋葱上的一层皮肤 - 该系统的用户只能看到皮肤,看不到里面的内容,而不是实现。但是,如果他们愿意,他们可以在上面添加自己的皮肤,并以这种方式实现新功能。他们无法挖掘洋葱,因为他们不知道里面有什么。当然,这是一个概括:他们不知道,因为它不形成API,他们和系统实现之间的契约。他们可以自由地读取源代码和/或对系统进行逆向工程,然后将事件过滤器插入他们想要的列表中的任何位置。毕竟,一旦您获得访问权限QObjectPrivate,您可以根据需要修改事件过滤器列表。但是,您不仅要对在公共 API 之上添加的内容的行为负责,还要对许多底层的行为负责 - 并且您的责任会扩大。更新工具包几乎是不可能的,因为您必须审核代码和/或验证测试覆盖率,以确保内部某处的某些内容没有被破坏。

最新更新