完整教程: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
#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<

浙公网安备 33010602011771号