Qt Android中如何获取MotionEvent.getToolType()的等效功能?
解决Qt QQuickItem中检测触控工具类型(手指/触控笔/橡皮擦)的方案
方案一:利用Qt自身触控事件属性(基础支持)
从Qt 5.10开始,QTouchPoint提供的flags()方法可区分部分工具类型:
- 触控笔:判断
touchPoint.flags() & Qt::TouchPointPen是否为真 - 手指:未标记特殊工具类型的触点默认视为手指,但这种方式无法区分橡皮擦
另外可通过QTouchDevice::capabilities()判断设备是否支持触控笔输入(QTouchDevice::Stylus),但同样无法识别橡皮擦。
示例代码:
void YourWhiteboardItem::touchEvent(QTouchEvent *event) { for (const QTouchPoint &touchPoint : event->touchPoints()) { if (touchPoint.flags() & Qt::TouchPointPen) { // 处理触控笔输入 } else { // 处理手指输入 } } QQuickItem::touchEvent(event); }
方案二:通过JNI调用Android原生API(精准匹配需求)
Qt在Android平台基于原生框架封装,可直接获取底层MotionEvent调用getToolType(),完全对应Android原生逻辑:
1. 项目配置
在.pro文件中添加JNI支持:
QT += androidextras
2. C++代码实现
#include <QAndroidJniObject> #include <QAndroidJniEnvironment> void YourWhiteboardItem::touchEvent(QTouchEvent *event) { #ifdef ANDROID QAndroidJniObject motionEvent = event->nativeEvent().value<QAndroidJniObject>(); if (motionEvent.isValid()) { QAndroidJniEnvironment env; for (const QTouchPoint &touchPoint : event->touchPoints()) { jint pointerIndex = touchPoint.id(); jint toolType = motionEvent.callMethod<jint>("getToolType", "(I)I", pointerIndex); // 对应Android MotionEvent的工具类型枚举 const jint TOOL_TYPE_FINGER = 0; const jint TOOL_TYPE_STYLUS = 1; const jint TOOL_TYPE_ERASER = 3; switch (toolType) { case TOOL_TYPE_FINGER: // 处理手指输入 break; case TOOL_TYPE_STYLUS: // 处理触控笔输入 break; case TOOL_TYPE_ERASER: // 处理橡皮擦输入 break; default: // 其他工具类型 break; } } } #endif QQuickItem::touchEvent(event); }
方案三:使用Qt Quick Pointer Handler(Qt 5.14+)
若项目基于Qt Quick 2.14及以上,可通过PointerHandler类的pointer.pointerType()判断:
PointerDevice.Finger:手指PointerDevice.Stylus:触控笔PointerDevice.Eraser:橡皮擦(兼容性依赖设备支持)
示例QML代码(也可在C++中处理对应事件):
Item { TapHandler { onTapped: { switch (pointer.pointerType) { case PointerDevice.Finger: console.log("手指输入"); break; case PointerDevice.Stylus: console.log("触控笔输入"); break; case PointerDevice.Eraser: console.log("橡皮擦输入"); break; } } } }
内容的提问来源于stack exchange,提问作者forlayo
相关产品推荐
相关产品推荐

