You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 19:58:29