上下文:我正在尝试创建一个类似推子的小部件,它可以在同一视图中具有多个实例,每个实例都可以由不同的手指同时控制。
我想用Qt的手势识别系统 http://qt-project.org/doc/qt-4.8/gestures-overview.html,但我还需要一些超出标准的功能Qt::PanGesture
。为此,我对两者进行了子类化QGesture
and QGestureRecognizer
. In FooGestureRecognizer::recognize(...)
,我目前正在拦截这两个QMouseEvent
s and QTouchEvent
s(至少目前是这样)。
在 Windows 上我只收到QMouseEvent
s - 我处理它们并且一切都按预期工作(尽管显然当我的输入来自物理鼠标时我不必处理多点触控问题)。我收到的事件(按顺序):
QEvent::MouseButtonPress
- 一串
QEvent::MouseMove
s
QEvent::MouseButtonRelease
在 Android 上,我收到了奇怪的组合QMouseEvent
s and QTouchEvent
s(按顺序):
QEvent::TouchBegin
QEvent::MouseButtonPress
-
QEvent::MouseMove
(实际位置没有变化)
- Another
QEvent::MouseButtonPress
(不知道为什么我需要另一个)
- 我的实际字符串
QEvent::MouseMove
s,正如预期的那样
QEvent::MouseButtonRelease
全局属性Qt::AA_SynthesizeMouseForUnhandledTouchEvents http://qt-project.org/doc/qt-5/qt.html#ApplicationAttribute-enum is true
默认情况下。关闭它会将我收到的事件更改为:
...没有其他的。
这是一个前置问题:我可以在里面做什么QGestureRecognizer::recognize()
告诉 Qt 我正在处理QEvent::TouchBegin
,并且它不需要合成QEvent::MouseButtonPress
for me? event->accept()
似乎没有任何区别。
实际问题:如果(如图所示)Qt 正在综合MouseEvent
s from TouchEvent
s,为什么我看到我看到QEvent::MouseMove
and QEvent::MouseButtonRelease
但不是QEvent::TouchUpdate
or QEvent::TouchRelease
?
代码是可用的,但为了简洁起见,我没有将其包含在此处。有需要请询问。
来自QTouchEvent docs http://qt-project.org/doc/qt-5/qtouchevent.html#event-handling:
QEvent::TouchUpdate 和 QEvent::TouchEnd 事件被发送到接受 QEvent::TouchBegin 事件的小部件或项目。如果 QEvent::TouchBegin 事件未被接受并且未被事件过滤器过滤,则在下一个 QEvent::TouchBegin 之前不会发送进一步的触摸事件。
这个问题的根源在于QGestureRecognizer
不接受初始TouchBegin
,因此我们不会收到任何进一步的触摸事件。我通过以下方式解决了这个问题:
- 创建精简事件过滤器
QObject
属于我的QGestureRecognizer
.
包含以下代码:
bool FooGestureRecognizer::FooEventFilter::eventFilter(QObject *Object, QEvent *Event)
{
if(Event->type() == QEvent::TouchBegin)
{
return true;
}
else
{
return QObject::eventFilter(Object, Event);
}
}
- 安装我的事件过滤器并调用
setAttribute(Qt::WA_AcceptTouchEvents)
在每个有效*Target
通过FooGestureRecognizer::create()
.
返回true
from eventFilter
告诉 Qt 我的推子有兴趣接收进一步的触摸事件,并且这些触摸事件按预期传递到手势识别器。
这个解决方案感觉像是一种 hack,并且在 Qt 的未来版本中可能不需要,所以我将密切关注这段代码。
Notes:
- 在建造一个
QGestureRecognizer
, create()
被调用时带有 nullTarget
(期待一个假人QGesture
予以退回)。如果您要在所有事件上安装事件过滤器,请注意这一点Target
s.
- 我的应用程序需要以一种方式处理桌面鼠标事件,并以另一种方式处理多指触摸事件,因此我已禁用
Qt::AA_SynthesizeMouseForUnhandledTouchEvents
。保持启用此功能可能会导致其他考虑(例如,我不确定您是否需要return true
对于所有触摸事件eventFilter
,以避免它们被复制为合成鼠标事件)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)