上下文:我正在尝试创建一个类似推子的小部件,它可以在同一 View 中有多个实例,每个实例都可以由不同的手指同时控制。
我想使用 Qt 的 gesture recognition system ,但我还需要一些超出标准 Qt::PanGesture
的功能。为此,我对 QGesture
和 QGestureRecognizer
进行了子类化。在 FooGestureRecognizer::recognize(...)
中,我目前正在拦截 QMouseEvent
s 和 QTouchEvent
s(至少目前是这样)。
在 Windows 上,我只收到 QMouseEvent
s - 我处理它们并且一切都按预期工作(尽管当我的输入来自物理鼠标时,显然我不必处理多点触控问题)。我收到的事件(按顺序):
QEvent::MouseButtonPress
QEvent::MouseMove
s QEvent::MouseButtonRelease
在 Android 上,我收到了
QMouseEvent
和 QTouchEvent
的奇怪组合(按顺序):QEvent::TouchBegin
QEvent::MouseButtonPress
QEvent::MouseMove
(位置没有实际变化)QEvent::MouseButtonPress
(不知道为什么我需要另一个)QEvent::MouseMove
字符串,正如预期的那样 QEvent::MouseButtonRelease
全局属性
Qt::AA_SynthesizeMouseForUnhandledTouchEvents
默认为 true
。关闭它会将我收到的事件更改为:QEvent::TouchBegin
...没有其他的。
这是一个前置问题: 我可以在
QGestureRecognizer::recognize()
中做什么来告诉 Qt 我正在处理 QEvent::TouchBegin
,并且它不需要为我合成 QEvent::MouseButtonPress
? event->accept()
似乎没有任何区别。实际问题: 如果(看起来)Qt 正在从
MouseEvent
s 合成 TouchEvent
s,为什么我看到我看到 QEvent::MouseMove
和 QEvent::MouseButtonRelease
而不是 QEvent::TouchUpdate
或 QEvent::TouchRelease
? 代码可用,但为了简洁起见,我没有将其包含在此处。如果需要请询问。
最佳答案
从 QTouchEvent
docs :
这个问题的根源是 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
返回 eventFilter
告诉 Qt 我的推子有兴趣接收更多的触摸事件,这些触摸事件按预期传递给手势识别器。这个解决方案感觉像是一个黑客,在 Qt 的 future 版本中可能不需要这个解决方案,所以我将密切关注这段代码。
笔记:
QGestureRecognizer
的构建过程中, create()
被调用时带有一个 null Target
(期望返回一个虚拟的 QGesture
)。如果您在所有 Target
上安装事件过滤器,请注意这一点。 Qt::AA_SynthesizeMouseForUnhandledTouchEvents
。保持启用可能会导致其他考虑(例如,我不确定您是否需要为 return true
中的所有触摸事件使用 eventFilter
,以避免它们被复制为合成鼠标事件)。 关于android - 为什么我的 QGestureRecognizer 没有收到触摸事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23369431/