Qt支持USB触摸屏热插拔

本文介绍了解决Qt程序中USB触摸屏热插拔问题的方法。通过修改Qt源码,使程序能够在触摸屏拔插时正常响应。适用于Qt 4.8.6版本,涉及tslib库和qmousetslib_qws.cpp文件的修改。

最近测试发现,运行qt程序,当使用USB触摸屏时,在触摸屏拔出后触摸屏的event节点会消失,当再次插入触摸屏时,即使生成了相同的节点,屏幕已经不能点击了。

解决办法:

解决办法:修改qt源码,使qt支持触屏的热插拔,使用的qt库为4.8.6

因为使用的是使用的是tslib库,对应的源码在qt源码中的src/gui/embedded/qmousetslib_qws.cpp

在QWSTslibMouseHandlerPrivate::readMouseData()的开始处加入以下代码,即可支持热插拔:

void QWSTslibMouseHandlerPrivate::readMouseData() 
{
    if(!qt_screen)
        return;
    /* Support usb touchscreen hotplug */
    int version;
    if (ioctl(ts_fd(dev), EVIOCGVERSION, &version) < 0) {
        disconnect(mouseNotifier, 0, 0, 0);
        delete mouseNotifier;
        while (1) {
            if(open()) {
                mouseNotifier = new QSocketNotifier(ts_fd(dev), QSocketNotifier::Read, this);
                connect(mouseNotifier, SIGNAL(activated(int)), this, SLOT(readMouseData()));
                resume();
                return;
            }
            system("echo waiting for tp ...");
            system("sleep 1");
        }
    }
    /* end */
    ...
}

重新编译qt,将生成的libQtGui.so.4.8.6替换到机器上即可。

 

### 解决QTSlib.cpp中的触摸屏热插拔问题 对于嵌入式设备中使用的Qt框架,默认情况下,当USB接口上的触摸屏被拔出再重新入时,可能会遇到触摸无响应的情况。针对这一现象,在Qt版本5.9.5中存在的一种简易解决方案涉及修改`qtslib.cpp`文件来增强其对硬件变化的支持。 #### 修改`qtslib.cpp`实现热插拔支持的方法 为了使Qt能够识别并适应新连接的触摸屏设备,可以在初始化过程中加入udev监控机制,以便实时监听到设备状态的变化。具体来说: 1. **引入Udev库** 通过包含必要的头文件以及链接对应的库,可以利用Linux下的Udev服务来进行设备管理。这允许程序接收到来自系统的信号通知,告知有新的输入设备接入或是已有设备断开[^1]。 ```cpp #include <libudev.h> ``` 2. **创建事件处理器** 定义一个函数用于处理来自Udev的通知消息,该函数会在检测到特定类型的变更(如添加或移除)时触发相应动作,比如刷新当前可用的触摸屏列表,并尝试重新打开默认配置项所指向的新设备节点。 3. **注册回调** 设置好上述提到的消息循环之后,下一步就是将其绑定至应用程序生命周期内适当的位置上执行。通常是在窗口显示之前完成这项工作最为理想,这样能确保一旦启动就能立即感知任何已存在的外设状况改变。 4. **更新现有逻辑** 最后一步是对原有的读取路径进行调整,使之能够在每次接收到有效变动提示后动态获取最新的实际物理地址而非固定不变的一串字符串常量值;同时也要考虑到多点触控场景下可能涉及到多个实例共存的情形,因此还需要适当地扩展内部数据结构以容纳更多可能性。 #### 常见问题及其应对策略 - 如果即使经过以上改动仍然无法正常运作,则可能是由于权限不足造成的访问失败。此时建议赋予进程足够的操作权利或者切换成root用户运行测试版软件。 - 对于某些特殊型号的屏幕而言,或许会面临驱动层面不兼容的问题。这时应当查阅官方文档确认是否有必要安装额外的支持包或者是寻找社区贡献的相关补丁资源加以应用。 - 当面对复杂环境下的频繁拔情况时,应考虑增加一定的延时等待时间给系统足够机会去稳定下来再继续后续流程,从而减少误判概率提高整体稳定性.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值