qt-touch

 

Qt移植对USB鼠标键盘、触摸屏的支持

分类: ARM Qt Linux   562人阅读  评论(0)  收藏  举报

目录(?)[+]

一、USB键盘

经过一番搜索,发现对Qt键盘的支持主要关系到两个方面:

1、 键盘类型确定:
      4.7以前的Qt版本,如果是PS2圆孔键盘,Qt编译时需加上选项:-qt-kbd-vr41xx(未测试);如果是USB键盘,需加上-qt-kbd-usb选项。
      Qt4.7.3默认的是tty,对于USB键盘可用,不需要配置。
  2、环境变量设置:

      然后移植到目标板上,还需要设置环境变量QWS_KEYBOARD:

         $export QWS_KEYBOARD="USB:/dev/input/event0"

     对于qt鼠标键盘移植问题,还是有点纳闷。

       $export set QWS_KEYBOARD="TTY:/dev/tty1"
 根据不同的开发板,这个似乎不同。我的:
       $export set QWS_KEYBOARD="TTY:/dev/input/event4"
qt的程序有键盘输入值,但是是很多不规则的字符集,不知道为什么。
       $./qt -qws 
Could not initialize virtual console switching.

 

     问题解决了:

     不要使用QWS_KEYBOARD,这个设置适合自己做按键;使用QWS_USB_KEYBOARD,这个是支持USB标准键盘的。

            $export QWS_USB_KEYBOARD=/dev/input/event4

 3、说明:

     提示:可以用 $cat /dev/input/event 拔插USB键盘,查看哪个是你的键盘设备节点。有两个设备节点,可以用

            $cat /dev/input/event4 或$cat  /dev/input/event5 回车,再按键盘,看终端是否有字符输出,可以确定可用的设备节点。

     推荐帖子:

     http://www.qtcn.org/bbs/simple/?t47670.html


二、USBS鼠标:


看大网上的同志用:
TSLIB_QWS_MOUSE_PROTO="TPanel:/dev/event0 USB:/dev/mouse0
双飞燕:
TSLIB_QWS_MOUSE_PROTO="TSLIB:/dev/event0 Itellimouse:/dev/mouse0
TSLIB_QWS_MOUSE_PROTO="TSLIB:/dev/event0 MouseMap:/dev/mouse0

1、环境变量设置:

1.1 微软鼠标(USB无线)
不同的鼠标环境变量设置可能不一样。我的是Microsoft的:
TSLIB_QWS_MOUSE_PROTO="Microsoft:/dev/input/event6 TSLIB:/dev/input/touchsreen0"

     $export TSLIB_QWS_MOUSE_PROTO=" linuxtp :/dev/input/event6 TSLIB:/dev/input/touchsreen0"
这样设置,打开Qt程序,开始可见的鼠标箭头,在鼠标点击后消失了。

     $export TSLIB_QWS_MOUSE_PROTO=" MouseMan :/dev/input/event6 TSLIB:/dev/input/touchsreen0"
这样设置,打开Qt程序,开始可见的鼠标箭头,鼠标能移动一下下。
     $./qt -qws
hidraw: pid 1884 passed too short report
hidraw: pid 1884 passed too short report
hidraw: pid 1884 passed too short report
hidraw: pid 1884 passed too short report
hidraw: pid 1884 passed too short report
hidraw: pid 1884 passed too short report
hidraw: pid 1884 passed too short report


1.2 雷柏鼠标(USB无线)
我用雷柏的USB无线鼠标:
     $export QWS_MOUSE_PROTO="linuxtp:/dev/hidraw3 TSLIB:/dev/input/touchsreen0"
鼠标能够一定,但是移动很絮乱。无法点击想选中的目标。


解决了鼠标不可用的问题,我还未来得及研究,先写着。
1.3 最新进展,鼠标可用
配置内核,重新编译内核:
#vim arm/arch/omap3_stalker_defconfig
CONFIG_INPUT_MOUSEDEV=y 

CONFIG_INPUT_MOUSE=y 

不用配置QWS_MOUSE_PROTO,配置过的

#export QWS_MOUSE_PROTO=""

这样鼠标触摸屏都可以用了,鼠标很正常,触摸可以用,但是到处乱跳。

下面三个配置参数没有找到,我也没配置,也可以用的。
CONFIG_INPUT_MOUSEDEV_PSAUX=y 
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 

1.4 鼠标、触摸屏同时使用

export QWS_MOUSE_PROTO="tslib:/dev/input/touchscreen0 mouseman:/dev/input/mice"

3、说明:

帖子推荐:
上条验证有用。


  

Qt 应用程序中模拟多点触控手势(如捏合)可以通过使用 `QTouchEvent` 和 `QPinchGesture` 来实现。Qt 提供了丰富的触摸事件支持,允许开发者通过编程方式创建和处理复杂的触摸手势。 ### 模拟捏合手势的步骤 1. **创建触摸设备对象**:首先需要创建一个表示触摸设备的对象,通常使用 `QTouchDevice` 类来定义触摸屏的属性。 2. **生成触摸点**:通过 `QTouchEvent` 创建多个触摸点,每个触摸点对应一个手指的位置信息。例如,在捏合手势中,通常会有两个手指进行操作。 3. **触发触摸事件**:将生成的触摸事件发送到目标窗口部件(widget),从而模拟用户正在进行的触摸操作。 4. **处理捏合手势**:使用 `QPinchGesture` 来检测和响应捏合手势。当两个手指之间的距离发生变化时,可以调整缩放比例或执行其他操作。 以下是一个简单的代码示例,展示如何在 Qt 中模拟捏合手势: ```cpp #include <QApplication> #include <QWidget> #include <QTouchEvent> #include <QPinchGesture> #include <QDebug> class TouchWidget : public QWidget { public: TouchWidget(QWidget *parent = nullptr) : QWidget(parent) {} protected: void touchEvent(QTouchEvent *event) override { if (event->type() == QEvent::TouchBegin || event->type() == QEvent::TouchUpdate || event->type() == QEvent::TouchEnd) { QList<QTouchEvent::TouchPoint> touchPoints = event->touchPoints(); if (touchPoints.size() >= 2) { // 获取两个手指的位置 QPointF pos1 = touchPoints[0].pos(); QPointF pos2 = touchPoints[1].pos(); // 计算中心点和距离 QPointF center = (pos1 + pos2) / 2; qreal distance = QLineF(pos1, pos2).length(); static qreal lastDistance = 0; if (lastDistance != 0) { qreal scale = distance / lastDistance; qDebug() << "Scale factor:" << scale; } lastDistance = distance; } } QWidget::touchEvent(event); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); TouchWidget widget; widget.resize(400, 300); widget.show(); // 创建触摸设备 QTouchDevice *device = new QTouchDevice; device->setType(QTouchDevice::TouchScreen); QAccessible::installFactory(TouchWidget::accessibleInterfaceFactory); // 模拟触摸事件 QList<QTouchEvent::TouchPoint> touchPoints; QTouchEvent::TouchPoint point1; point1.setId(0); point1.setPos(QPointF(100, 150)); point1.setStartPos(QPointF(100, 150)); point1.setLastPos(QPointF(100, 150)); point1.setScreenPos(QPointF(100, 150)); point1.setStartScreenPos(QPointF(100, 150)); point1.setLastScreenPos(QPointF(100, 150)); point1.setState(Qt::TouchPointPressed); QTouchEvent::TouchPoint point2; point2.setId(1); point2.setPos(QPointF(200, 150)); point2.setStartPos(QPointF(200, 150)); point2.setLastPos(QPointF(200, 150)); point2.setScreenPos(QPointF(200, 150)); point2.setStartScreenPos(QPointF(200, 150)); point2.setLastScreenPos(QPointF(200, 150)); point2.setState(Qt::TouchPointPressed); touchPoints << point1 << point2; QTouchEvent touchEvent(QEvent::TouchBegin, device, Qt::NoModifier, Qt::TouchPointPressed, touchPoints); QCoreApplication::sendEvent(&widget, &touchEvent); return app.exec(); } ``` ### 解释 - **QTouchDevice**:用于描述触摸设备的类型,这里设置为 `TouchScreen`。 - **QTouchEvent**:用于生成触摸事件,包含多个触摸点的信息。 - **QPinchGesture**:虽然在这个例子中没有直接使用 `QPinchGesture`,但在实际应用中可以通过注册手势识别器来捕获捏合手势并进行处理。 - **touchEvent**:重写了 `QWidget` 的 `touchEvent` 方法,以便处理触摸事件并计算捏合手势的缩放比例。 ### 注意事项 - 在模拟触摸事件时,确保触摸点的状态正确更新(如按下、移动、释放)。 - 可以根据需要调整触摸点的位置和数量,以模拟不同的手势。 - 如果需要更复杂的手势识别功能,建议使用 `QGestureRecognizer` 和 `QPinchGesture` 进行高级处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值