【发布时间】:2014-07-12 13:27:21
【问题描述】:
我在父小部件中实现了一种手势监听器。如果鼠标事件是点击(没有任何移动事件的按下和释放),那么该小部件的子级应该处理该事件,如果不是,并且事件描述了滑动,那么父小部件应该处理这些事件。有什么方法可以先将事件重定向到父母,然后重新广播它们,以便在需要时适当的孩子可以处理它。
【问题讨论】:
标签: qt event-handling
我在父小部件中实现了一种手势监听器。如果鼠标事件是点击(没有任何移动事件的按下和释放),那么该小部件的子级应该处理该事件,如果不是,并且事件描述了滑动,那么父小部件应该处理这些事件。有什么方法可以先将事件重定向到父母,然后重新广播它们,以便在需要时适当的孩子可以处理它。
【问题讨论】:
标签: qt event-handling
我认为http://qt-project.org/doc/qt-4.8/qobject.html#installEventFilter 是您正在寻找的。所以你要做的是设置任何继承自QObject 的类并将其设置为事件过滤器。所以引用文档:
An event filter is an object that receives all events that are sent to this object.
The filter can either stop the event or forward it to this object.
链接中的示例适用于QKeyEvent,但显然也可以适应各种鼠标功能。下面是一个虚拟示例,它将“吃”第一次单击 QPushButton,而如果您双击,事件将正常进行(请注意,在此特定示例中,首先您将调用“吃”序列,然后在短时间内第二次单击按钮将接管)。
bool MyWidget::eventFilter(QObject *obj, QEvent *event)
{
if( obj != pushButton ) {
return QObject::eventFilter(obj, event);
}
if (event->type() == QEvent::MouseButtonPress ) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
qDebug("Intercepted mouse click with button %d", mouseEvent->button());
return true;
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}
这有帮助吗?
【讨论】: