完整教程:Windows Pad平板对 Qt 的支持

        Qt 对 Windows 平板(包括二合一设备)的支持非常出色且成熟。这主要得益于 Qt 强大的跨平台抽象能力和对 Windows 原生触控 API 的深度集成。

1. 核心支持:Qt 输入事件模型

Qt 将所有用户交互(鼠标、触摸、手写笔、手势)都统一封装成了 QInputEvent 及其子类。这使得开发者可以用一套逻辑处理多种输入方式,极大地简化了开发。

a) 点击与触摸 (Touch Events)
  • 支持级别原生支持

  • 事件类型

    • QTouchEvent: 封装了多点触控信息。每个触点都是一个 QTouchEvent::TouchPoint,包含了位置、压力、面积等信息。

    • QMouseEvent: 为了向后兼容,默认情况下,Windows 上的触摸操作也会被模拟成鼠标事件。比如,手指按下会生成 QEvent::MouseButtonPress

  • 如何处理

    • 方法一(推荐):启用原生触摸事件。在你的窗口或部件上设置以下属性,这样 Qt 就会产生原生的 QTouchEvent 而不是模拟鼠标事件。

      cpp

      yourWidget->setAttribute(Qt::WA_AcceptTouchEvents);

      然后重写 bool event(QEvent *event) 函数来处理 QEvent::TouchBeginQEvent::TouchUpdateQEvent::TouchEnd

    • 方法二:使用手势 API(见下文)。

    • 方法三:依赖模拟的鼠标事件。对于简单的点击操作,这已经足够了,但你无法获得多点触控的优势。

基础触摸配置
#include 
#include 
class TouchWidget : public QWidget
{
protected:
    bool event(QEvent *event) override
    {
        switch (event->type()) {
        case QEvent::TouchBegin:
            qDebug() << "Touch Begin";
            return true;
        case QEvent::TouchUpdate:
            qDebug() << "Touch Update";
            return true;
        case QEvent::TouchEnd:
            qDebug() << "Touch End";
            return true;
        case QEvent::TouchCancel:
            qDebug() << "Touch Cancel";
            return true;
        case QEvent::Gesture:
            return gestureEvent(static_cast(event));
        default:
            break;
        }
        return QWidget::event(event);
    }
    bool gestureEvent(QGestureEvent *event)
    {
        if (QGesture *pan = event->gesture(Qt::PanGesture)) {
            auto *panGesture = static_cast(pan);
            qDebug() << "Pan gesture:" << panGesture->delta();
        }
        if (QGesture *pinch = event->gesture(Qt::PinchGesture)) {
            auto *pinchGesture = static_cast(pinch);
            qDebug() << "Pinch gesture - scale:" << pinchGesture->scaleFactor();
        }
        if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) {
            auto *swipeGesture = static_cast(swipe);
            qDebug() << "Swipe gesture - angle:" << swipeGesture->swipeAngle();
        }
        return true;
    }
};
多点触控支持
class MultiTouchWidget : public QWidget
{
protected:
    bool event(QEvent *event) override
    {
        if (event->type() == QEvent::TouchBegin ||
            event->type() == QEvent::TouchUpdate ||
            event->type() == QEvent::TouchEnd) {
            QTouchEvent *touchEvent = static_cast<
posted @ 2025-11-08 18:40  gccbuaa  阅读(8)  评论(0)    收藏  举报