2013-07-08 104 views
1

拦截轮事件以下是事件过滤器:事件过滤器不能从QScrollArea

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) 

如何在页面滚动期间拦截滚轮事件?

回答

3

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

为了解决这个问题,只需安装事件过滤器到viewport()部件来代替。