c++ - 当第一根手指从触摸屏上移开时,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 代码示例(在上面的链接中提供),我在类中插入了ImageWidget
QGestures 的事件过滤器。我调用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 文档示例来显示此效果,仅包括两个放大/缩小按钮以更好地说明问题。也在这里,对问题进行一些解释。关于如何解决这个错误的任何想法?
解决方案
推荐阅读
- python - 如何为我的编码语言修复我的模块系统?
- ruby - 简单的 Ruby 程序不产生输出
- javascript - Javascript - 听哪个事件以了解是否出现弹出菜单
- python - Python Numpy 用任意维度的方阵制作图案
- javascript - 如何更改 woocommerce 购物车页面上的默认数量选择器?
- c++ - 使用带有 /GL 选项的 cl.exe 时,msvc .obj (COFF?) 文件格式是什么?
- api - 保护对网站的 chrome 扩展谷歌日历 API 调用
- python - 从列表中获取字典值
- pine-script - 当 MFI 高于 50 并且 DMI+ 穿过 DMI- 时,如何创建一个将买入/卖出信号放在图表上的 pine 脚本
- python - Else 是无效的语法