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::TouchBegin
,QEvent::TouchUpdate
,QEvent::TouchEnd
。 -
方法二:使用手势 API(见下文)。
-
方法三:依赖模拟的鼠标事件。对于简单的点击操作,这已经足够了,但你无法获得多点触控的优势。
-
基础触摸配置
#include <QApplication>
#include <QWidget>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<QGestureEvent*>(event));default:break;}return QWidget::event(event);}bool gestureEvent(QGestureEvent *event){if (QGesture *pan = event->gesture(Qt::PanGesture)) {auto *panGesture = static_cast<QPanGesture*>(pan);qDebug() << "Pan gesture:" << panGesture->delta();}if (QGesture *pinch = event->gesture(Qt::PinchGesture)) {auto *pinchGesture = static_cast<QPinchGesture*>(pinch);qDebug() << "Pinch gesture - scale:" << pinchGesture->scaleFactor();}if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) {auto *swipeGesture = static_cast<QSwipeGesture*>(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<