为什么我的 QGestureRecognizer 收不到触摸事件?

2024-04-27

上下文:我正在尝试创建一个类似推子的小部件,它可以在同一视图中具有多个实例,每个实例都可以由不同的手指同时控制。

我想用Qt的手势识别系统 http://qt-project.org/doc/qt-4.8/gestures-overview.html,但我还需要一些超出标准的功能Qt::PanGesture。为此,我对两者进行了子类化QGesture and QGestureRecognizer. In FooGestureRecognizer::recognize(...),我目前正在拦截这两个QMouseEvents and QTouchEvents(至少目前是这样)。

在 Windows 上我只收到QMouseEvents - 我处理它们并且一切都按预期工作(尽管显然当我的输入来自物理鼠标时我不必处理多点触控问题)。我收到的事件(按顺序):

  • QEvent::MouseButtonPress
  • 一串QEvent::MouseMoves
  • QEvent::MouseButtonRelease

在 Android 上,我收到了奇怪的组合QMouseEvents and QTouchEvents(按顺序):

  • QEvent::TouchBegin
  • QEvent::MouseButtonPress
  • QEvent::MouseMove(实际位置没有变化)
  • Another QEvent::MouseButtonPress(不知道为什么我需要另一个)
  • 我的实际字符串QEvent::MouseMoves,正如预期的那样
  • QEvent::MouseButtonRelease

全局属性Qt::AA_SynthesizeMouseForUnhandledTouchEvents http://qt-project.org/doc/qt-5/qt.html#ApplicationAttribute-enum is true默认情况下。关闭它会将我收到的事件更改为:

  • QEvent::TouchBegin

...没有其他的。

这是一个前置问题:我可以在里面做什么QGestureRecognizer::recognize()告诉 Qt 我正在处理QEvent::TouchBegin,并且它不需要合成QEvent::MouseButtonPress for me? event->accept()似乎没有任何区别。

实际问题:如果(如图所示)Qt 正在综合MouseEvents from TouchEvents,为什么我看到我看到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,因此我们不会收到任何进一步的触摸事件。我通过以下方式解决了这个问题:

  1. 创建精简事件过滤器QObject属于我的QGestureRecognizer.

包含以下代码:

bool FooGestureRecognizer::FooEventFilter::eventFilter(QObject *Object, QEvent *Event)
{
  if(Event->type() == QEvent::TouchBegin)
  {
    return true;
  }
  else
  {
    return QObject::eventFilter(Object, Event);
  }
}
  1. 安装我的事件过滤器并调用setAttribute(Qt::WA_AcceptTouchEvents)在每个有效*Target通过FooGestureRecognizer::create().

返回true from eventFilter告诉 Qt 我的推子有兴趣接收进一步的触摸事件,并且这些触摸事件按预期传递到手势识别器。

这个解决方案感觉像是一种 hack,并且在 Qt 的未来版本中可能不需要,所以我将密切关注这段代码。

Notes:

  • 在建造一个QGestureRecognizer, create()被调用时带有 nullTarget(期待一个假人QGesture予以退回)。如果您要在所有事件上安装事件过滤器,请注意这一点Targets.
  • 我的应用程序需要以一种方式处理桌面鼠标事件,并以另一种方式处理多指触摸事件,因此我已禁用Qt::AA_SynthesizeMouseForUnhandledTouchEvents。保持启用此功能可能会导致其他考虑(例如,我不确定您是否需要return true对于所有触摸事件eventFilter,以避免它们被复制为合成鼠标事件)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 QGestureRecognizer 收不到触摸事件? 的相关文章

  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • Android Youtube API 可用吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有适用于 Android 的 YouTube API 吗 如果不是 除了通过网络浏览器之外 如何从 Yo
  • 方法“xxx”不能是事件的方法,因为该类派生的类已经定义了该方法

    我有一个代码 public class Layout UserControl protected void DisplayX DisplayClicked object sender DisplayEventArgs e CurrentDi
  • 如何使用 wpf webbrowser 将数据发布到 Web 服务器

    我想从数据库获取数据并使用它来让用户登录到网站 我有一个包含 Web 浏览器控件的 wpf 页面 我有这样的代码 用于将用户登录到用 php 编写的网站
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 当创建 Android Jetpack Compose AndroidView 的参数发生变化时,如何替换它?

    我有一个应用程序 显示封装在其中的几个不同视图AndroidView 在下面重现的简单示例中 这些只是TextView实例 问题是更改文本 在本例中循环显示三个不同的值 似乎不会更新应用程序显示的内容 sealed class AppVie
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 使用 AdHocWorkspace 会导致“不支持语言‘C#’”。

    在VS2015中使用Microsoft CodeAnalysis CSharp Workspaces的RC2 这段代码会抛出异常 var tree CSharpSyntaxTree ParseText var workspace new A
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • Android Windows:它们何时以及如何创建?

    我已经阅读了标准的 Windows 相关文档并翻阅了 一堆源代码 试图理解 Android 如何以及何时 窗口已创建 我相信我已经拥抱它并愿意 对其进行验证或更正 据我所知 只有两种方法可以获得 Window 对象的句柄 1 Activit
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 使用 foreach 循环和 XmlNodeList C# 将新节点附加到节点列表

    目前我处理的是这样的XML类型 XML FILE http 20drive google com open id 0By5BxgNi9eGcRldxcEZNU0FDTzQ 参考XML文件 我想检查一个节点 如果找不到该节点 我必须将该节点附
  • Android 图标与徽标

    The
  • 如何访问窗口?

    我正在尝试使用其句柄访问特定窗口 即System IntPtr value Getting the process of Visual Studio program var process Process GetProcessesByNam
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我
  • 如何在对话框中配置自定义按钮?

    这里我有一个自定义对话框 里面有背景 2 ImageButton 问题是 当我尝试为该按钮设置 onclick 侦听器时 程序将返回 NullPointerException 我不知道为什么会发生这种情况 无论如何如何将操作分配给对话框内的
  • 无法使 Polly 超时策略覆盖 HttpClient 默认超时

    我正在使用 Polly 重试策略 并且正如预期的那样 在重试过程中HttpClient达到 100 秒超时 我尝试了几种不同的方法来合并 Polly 超时策略 将超时移至每次重试而不是总计 但 100 秒超时仍然会触发 我读过大约 5 个

随机推荐