以下是事件过滤器:
bool ListenerClass::eventFilter(QObject *obj, QEvent *event) {
std::cout << "Got event type " << event->type() << std::endl;
return false;
}
以下是我在QScrollArea
this->listenerObj = new ListenerClass(this);
this->setAttribute(Qt::WA_Hover);
this->setAttribute(Qt::WA_NoMousePropagation, false);
this->installEventFilter(this->listenerObj);
上面的过滤器一般都可以工作,因为它可以拦截调整大小,悬停等事件。但是只有在达到滚动范围的边缘时才会拦截滚轮事件,而不是在滚动的整个持续时间内拦截。
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)
如何在页面滚动期间拦截滚轮事件?
答案 0 :(得分:3)
当用户滚动视口时,事件发生在滚动区域的viewport()
窗口小部件中。如果可以执行请求的滚动操作,则事件将被接受,并且不会传播到滚动区域本身,因此您无法检测到它。
要解决此问题,只需将事件过滤器安装到viewport()
小部件即可。