嵌入式QT程序同时支持触屏和鼠标的解决办法

本文介绍了在Qt4.8.6和arm-linux系统上,解决嵌入式程序同时支持触屏和鼠标的问题。通常通过tslib解决,但会导致触屏操作异常。解决思路包括固定event handler或修改内核源码,使得触屏设备与鼠标设备独立。

本帖子是基于 Qt4.8.6 ,arm-linux 内核版本2.6 。非常旧的软件和系统了,愿各位有识之士不需要用到这个经验😂😂😂

嵌入式QT程序需要支持触屏和鼠标同时使用,一般会使用tslib库(tslib和qt编译请参照网上其他帖子)

qt和tslib配置如下:

# 注意替换库文件路径和对应的设备文件路径
LIB_ROOT=/usr
QT_DIR=${LIB_ROOT}/qt4.8.6
TS_DIR=${LIB_ROOT}/tslib-1.8

export LD_LIBRARY_PATH=${LIB_ROOT}/lib:${QT_DIR}/lib:${TS_DIR}/lib:${ShellPath}
export QT_QWS_FONTDIR=${QT_DIR}/lib/fonts
export QWS_DISPLAY="LinuxFb:/dev/fb1"
export QWS_MOUSE_PROTO="mouseman:/dev/input/mice tslib:/dev/input/touchscreen0"
export TSLIB_TSDEVICE="/dev/input/touchscreen0"
export TSLIB_CONFFILE=${TS_DIR}/etc/ts.conf
export POINTERCAL_FILE=${TS_DIR}/etc/pointercal
export TSLIB_CALIBFILE=${TS_DIR}/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb1
export TSLIB_PLUGINDIR=${TS_DIR}/lib/ts

使用这个配置时,鼠标可以正常操作,触屏操作就显得有些魔性了...

解决思路:这个问题是由于触屏设备在input子系统注册的时候,会被视为一个mouse设备。/dev/input/mice这个设备会连接所有的mouse设备,导致触屏设备上报坐标变化时,/dev/input/mice也会上报,

嵌入式Qt中,当触摸屏鼠标同时可用时,处理MouseEventNotSynthesized(未合成鼠标事件)的情况,主要是因为Qt尝试将触摸输入映射到鼠标事件模型,但在某些情况下触控输入无法精确地转换成鼠标移动。这通常是由于物理限制、设备特性或者应用程序配置引起的。 要在这种情况下识别处理未合成的鼠标事件,你可以采取以下措施: 1. **设置事件过滤器**: 使用`QObject::installEventFilter()`函数为窗口或特定部件添加一个事件过滤器,对`QEvent::MouseButtonDblClick`、`QEvent::MouseMove`等鼠标事件进行拦截。 ```cpp QObject::connect(window, &QObject::customEvent, this, &YourClass::handleCustomEvent); ``` 2. **自定义事件处理**: 实现`handleCustomEvent`方法,在这里检查接收到的是不是一个MouseEventNotSynthesized。如果发现是,你可以选择忽略、记录日志或是提供其他自定义处理。 ```cpp void YourClass::handleCustomEvent(QEvent *event) { if (event->type() == QEvent::MouseMove && static_cast<QMouseEvent*>(event)->isSynthetic()) { // 检查是否为未合成事件 if (!static_cast<QMouseEvent*>(event)->synthesized()) { // 你的处理逻辑 qDebug() << "Received unsynthesized mouse move event"; } } } ``` 3. **区分触摸输入鼠标输入**: 使用Qt提供的`QTouchEvent`类,可以获取触屏事件,并与鼠标事件分开处理。在事件处理器中,对比`QTouchEvent``QMouseEvent`,避免混淆。 ```cpp bool YourClass::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::TouchUpdate) { QTouchEvent *touchEvent = static_cast<QTouchEvent*>(event); // 处理触摸事件... } else if (event->type() == QEvent::MouseButtonPress || ...){ QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); // 处理鼠标事件... } return QObject::eventFilter(watched, event); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值