Qt 好的,手势。无法识别TapAndHold和Swipe

Qt 好的,手势。无法识别TapAndHold和Swipe,qt,gesture,Qt,Gesture,我尝试了一个“图像手势示例”。在本例中,您只有3个手势:PanGesture、PinchGesture和SwipeGesture。但Qt提供了5种手势: 塔普手势 TapandHold手势 泛河口 钳纹 SwipeGesture 为了识别所有5种手势,我们需要写入ImageWidget构造函数: grabGesture(Qt::TapGesture); grabGesture(Qt::TapAndHoldGesture); grabGesture(Qt::PanGesture); g

我尝试了一个“图像手势示例”。在本例中,您只有3个手势:PanGesture、PinchGesture和SwipeGesture。但Qt提供了5种手势:

  • 塔普手势
  • TapandHold手势
  • 泛河口
  • 钳纹
  • SwipeGesture
为了识别所有5种手势,我们需要写入ImageWidget构造函数:

 grabGesture(Qt::TapGesture);
 grabGesture(Qt::TapAndHoldGesture);
 grabGesture(Qt::PanGesture);
 grabGesture(Qt::PinchGesture);
 grabGesture(Qt::SwipeGesture);
我还添加了方法gesturevent()

bool ImageWidget::gestureEvent(QGestureEvent*event)
{
如果(Qsignature*swipe=event->signature(Qt::SwipeGesture))
滑动(静态施法(滑动));
else if(qsirpose*pan=event->sirpose(Qt::PanGesture))
panTriggered(静态_铸造(pan));
if(qsignature*pinch=event->signature(Qt::pinchgestrue))
夹紧(静态_铸造(夹紧));
如果(Q手势*点击=事件->手势(Qt::点击手势))
tap触发(静态_投射(tap));
如果(Qsirpose*tapandhold=事件->手势(Qt::TapandHoldSirpose))
{
tapandhold触发(静态_转换(tapandhold));
}
返回true;
}
并编写缺少的方法,如

void ImageWidget::tapTriggered(QTapGesture *gesture)
 {
    qDebug() << "TAP" << gesture->position();
 }

 void ImageWidget::tapandholdTriggered(QTapAndHoldGesture *tapandhold)
 {
     qDebug() << "TAPANDHOLD";
 }
void ImageWidget::tapTriggered(qTap手势*手势)
{

qDebug()试试更新版本的Qt(不要提及您的操作系统或设备)。我不知道更新版本会更好,但我知道大约一年前,整个堆栈(X11事件、设备驱动程序、操作系统支持等)在不断变化和不完整。例如,正如我所记得的,在我尝试的时候,只有在Windows上使用Qt的手势才有效,Linux/Ubuntu(来自Canonical)正在进行中。

同样,如果您描述您的平台和触摸硬件会有所帮助

在OSX、Qt5、PyQt上,使用Apple TouchPad,我发现某些手势事件不会出现,除非您接受QGestureOverride类型的QEvent。文档中对此类事件的目的非常模糊。文档中确实说默认情况下忽略了这一点,这是一个例外:大多数其他手势默认接受,w这意味着同一姿态的进一步事件将会发生

手势“接受”的含义不同于事件“接受”的一般含义。“接受”手势似乎意味着“让更多事件发生”,而“接受”事件意味着“不要通过小部件链传播此事件”此外,文档对于接受QGestureEvent与接受Qsignature非常混淆。QGestureEvent是Qsignatures的组合。接受QGestureEvent与接受包含的手势是否相同非常混淆。请注意,Qsignature没有accept()方法,QGestureEvent有几个重载且方便的方法:accept()、setAccepted(bool)、setAccepted(手势、bool)、setAccepted(gestureType、bool)等

回到QGestureOverride类型的QEvent:Qt.QEvent枚举显示“Qt.QGestureOverride…(QGestureEvent)”,这对我来说意味着QGestureOverride类型的事件是QGestureEvent的子类,但事实并非如此:QGestureOverride类型的事件上没有biges()方法。(那么,人们如何知道您正在接受哪种手势呢?)而且似乎忽略事件的默认情况不仅仅是允许它传播,而是阻止包含的(sic)手势的后续事件(无论它们是什么)


例如,在我的一些测试中,在我接受QGestureOverride类型的QEvent之前,真实的双手指捏压从未生成任何具有捏压类型手势的手势事件,但确实生成了Pan类型的手势事件。然后,捏压手势事件首先出现,然后是捏压和Pan手势事件,当我在pi时不小心地平移我的两个手指时(注意,至少在OSX触控板上,平移(滚动操作)是两个手指,由设备驱动程序或控制面板定义相同?

你明白了吗?我还试图理解QListWidget中的手势捕捉。你解决了这个问题吗?我也面临着同样的问题。
void ImageWidget::tapTriggered(QTapGesture *gesture)
 {
    qDebug() << "TAP" << gesture->position();
 }

 void ImageWidget::tapandholdTriggered(QTapAndHoldGesture *tapandhold)
 {
     qDebug() << "TAPANDHOLD";
 }