首页 > 解决方案 > 当第一根手指从触摸屏上移开时,Qt 的手势行为

问题描述

我在 Ubuntu 上使用 Qt 5.8,运行一个处理捏合手势以放大或缩小图像 QWidget 的应用程序。问题是,有时,在一个捏合手势之后,当与其他组件交互时,图像会跳转。具体来说,当“您放在屏幕上的第一根手指是第一个被移除的手指”(从现在开始为 FFFR)时,就会发生这种情况。可以说这种情况发生在捏合执行次数的一半。

我通过查看事件日志观察到,当 FFFR 发生时,mouseReleaseEvent 不会发生,但如果手指从屏幕上移开,它会发生这种情况。因此,当捏合手势完成时,我可以强制执行 mouseButtonRelease:

    if (gesture->state() == Qt::GestureFinished)
{
    QMouseEvent eve( (QEvent::MouseButtonRelease), QCursor::pos(),
           Qt::LeftButton,
           Qt::LeftButton,
           Qt::NoModifier);
    qApp->sendEvent(mGraphicsView,&eve);
}

这解决了我的图像跳跃问题,但我仍然有一个问题,因为应用程序在我下次与之交互时仍然没有响应。似乎应用程序仍然由捏合手势控制:如果我尝试按下按钮,我需要触摸屏幕两次,第一次只是为了“释放”应用程序。我还有一个鼠标:如果在 FFFR 之后我移动鼠标,我看到另一个 mouseReleaseEvent 发生(在我用上面的代码引起的第一个之后),然后我可以在我的第一次屏幕触摸时实际按下一个按钮。

这是一个非常奇怪的行为,您可以使用 Qt 文档中的代码示例轻松复制它:https ://doc.qt.io/qt-5/qtwidgets-gestures-imagegestures-example.html

编译并运行,从包含 JPG 或 PNG 图像的对话框中选择一个文件夹。您可以试验已实现的手势(平移、滑动、旋转和缩放)。如果执行双击,图像将恢复为原始视图。但是,如果您执行 FFFR 的两个手指手势,则第一次尝试双击时不会发生任何事情。相反,通过以另一种方式从屏幕上移开手指,图像会在第一次双击时重置,这是应该的。如果您没有鼠标,您可以双击屏幕以获得相同的效果。

- - 更新 - -

我认为这需要更新......我已经意识到捏手势不是造成这种行为的原因。使用 Qt 代码示例(在上面的链接中提供),我在类中插入了ImageWidgetQGestures 的事件过滤器。我调用installEventFilter(this)构造函数并定义:

bool ImageWidget::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::Gesture)
    {
        gestureEvent(static_cast<QGestureEvent*>(event));
        return true;
    }else{
        return QObject::eventFilter(obj,event);
    }
}

此外,我删除了对手势处理程序的原始调用gestureEvent。所以现在我正在为图像小部件过滤 QGestures,但仍在处理它们。但是,如果我执行 FFFR,应用程序就会挂起!

这是一个已知的 Qt 错误。此处已报道,使用相同的 Qt 文档示例来显示此效果,仅包括两个放大/缩小按钮以更好地说明问题。也在这里,对问题进行一些解释。关于如何解决这个错误的任何想法?

标签: c++qtgesturemulti-touchpinch

解决方案


推荐阅读