Qt 事件筛选器无法从QScrollArea截获控制盘事件

Qt 事件筛选器无法从QScrollArea截获控制盘事件,qt,events,qscrollarea,Qt,Events,Qscrollarea,以下是事件筛选器: bool ListenerClass::eventFilter(QObject *obj, QEvent *event) { std::cout << "Got event type " << event->type() << std::endl; return false; } 上述过滤器通常工作,因为它可以截取事件,如调整大小、悬停等。但是,仅当达到滚动范围边缘时,才截取滚轮事件,而不是在整个滚动期间截取滚轮事件

以下是事件筛选器:

bool ListenerClass::eventFilter(QObject *obj, QEvent *event) {
    std::cout << "Got event type " << event->type() << std::endl;
    return false;
}
上述过滤器通常工作,因为它可以截取事件,如调整大小、悬停等。但是,仅当达到滚动范围边缘时,才截取滚轮事件,而不是在整个滚动期间截取滚轮事件

Viewport position    User action         Output
----------------------------------------------------------
Top                  downwards wheel     <<No output>>
Middle               downwards wheel     <<No output>>
Middle               downwards wheel     <<No output>>
Just touch bottom    downwards wheel     Got event type 31
Bottom (can't        downwards wheel     Got event type 31
 scroll anymore)
视口位置用户操作输出
----------------------------------------------------------
自上而下车轮
中下轮
中下轮
只需触摸底部向下的车轮即可获得事件类型31
底部(无法向下移动)事件类型31
滚动(不再)

如何在页面滚动期间截获控制盘事件?

当用户滚动视口时,事件发生在滚动区域的
viewport()
小部件中。如果请求的滚动操作是可能的,那么事件将被接受,并且不会传播到滚动区域本身,因此您无法检测到它

要解决此问题,只需将事件过滤器安装到
viewport()
小部件即可

Viewport position    User action         Output
----------------------------------------------------------
Top                  downwards wheel     <<No output>>
Middle               downwards wheel     <<No output>>
Middle               downwards wheel     <<No output>>
Just touch bottom    downwards wheel     Got event type 31
Bottom (can't        downwards wheel     Got event type 31
 scroll anymore)