当前位置: 首页 > news >正文

ok113i平台——qt+tslib支持usb触摸屏热插拔功能实现

问题:重新插拔设备,需要软件重启才能接收到触摸事件
愿因:是因为qt程序的tslib库的操作逻辑是在构造函数里面连接一次usb触摸设备,具体看如下文件内容:
/home/forlinx/OK113i-linux-sdk/buildroot/buildroot-201902/dl/qt5base/qtbase/src/platformsupport/input/tslib/qtslib.cpp;
所以重新插拔usb后,qt程序并没有重新连接usb触摸设备,导致没有触摸数据接收;
解决方案:
参考:https://blog.csdn.net/alone4together/article/details/115269753
参考方案中的代码需要更改一下,完整的qtslib.cpp更改内容如下:

QTsLibMouseHandler::QTsLibMouseHandler(const QString &key,
                                       const QString &specification,
                                       QObject *parent)
    : QObject(parent),
      m_notify(0), m_x(0), m_y(0), m_pressed(0), m_rawMode(false)
{
    m_dev=0;
    qCDebug(qLcTsLib) << "Initializing tslib plugin" << key << specification;
    setObjectName(QLatin1String("TSLib Mouse Handler"));
    ...
    ...
    else
    {
        qErrnoWarning(errno, "tslib: Cannot open input device %s", device.constData());
    }

    QFileSystemWatcher *m_fileWatcher = new QFileSystemWatcher(this);
    // QString dev_=device;
    m_fileWatcher->addPath(QLatin1String("/dev/input/")); // "dev/input/"
    connect(m_fileWatcher, &QFileSystemWatcher::directoryChanged, this, &QTsLibMouseHandler::handleHotPlugWatch);
}

void QTsLibMouseHandler::handleHotPlugWatch(const QString &path)
{
    QByteArray device = qgetenv("TSLIB_TSDEVICE");
    QFile file(QString::fromLocal8Bit(device)); // shoud be TSLIB_TSDEVICE
    qCDebug(qLcTsLib) << path << "is changing";
    if (file.exists())
    {
        qCDebug(qLcTsLib) << "tslib device disconnected .., try connecting ...";
        disconnect(m_notify, 0, 0, 0);
        if (m_notify){
            delete m_notify;
            m_notify = 0;
        }
        //  QByteArray device = qgetenv("TSLIB_TSDEVICE");
        m_dev = ts_open(device.constData(), 1);
        if (!m_dev)
        {
            qCDebug(qLcTsLib) << " touchscreen doesn't exist";
            qErrnoWarning(errno, "ts_open() failed");
        }
        else
        {
            if (ts_config(m_dev)){
                qErrnoWarning(errno, "ts_config() failed");
            }

            int fd = ts_fd(m_dev);
            if (fd >= 0)
            {
                qCDebug(qLcTsLib) << "tslib device is" << device;
                m_notify = new QSocketNotifier(fd, QSocketNotifier::Read, this);
                connect(m_notify, &QSocketNotifier::activated, this, &QTsLibMouseHandler::readMouseData);
            }
            else
            {
                qErrnoWarning(errno, "tslib: Cannot open input device %s", device.constData());
            }

            return;
        }
        qCDebug(qLcTsLib) << path << "is added";
    }
    else
    {
        if (m_dev){
            ts_close(m_dev);
            m_dev = 0;
        }
        qCDebug(qLcTsLib) << path << "is removed";
    }
}

改完qtslib.cpp需要编译buildroot,编译后的qtslib.cpp会在如下路径:
/home/OK113i-linux-sdk/out/t113_i/ok113i/longan/buildroot/build/qt5base-5.12.5/src/platformsupport/input/tslib/qtslib.cpp
需要注意单独编译的buildroot后,还需要全编译,才会将根文件系统镜像rootfs.ext2更新到系统镜像;

相关文章:

  • 定期自动统计大表执行情况
  • IWPA_CEC2005
  • 网络安全行业有哪些公司
  • 网络安全评估指南 网络安全评价体系
  • MySQL数据类型
  • 全新的Android UI框架Jetpack Compose
  • 介绍 Kamailio 的 kamcmd
  • 如何进行市场趋势分析:方法与案例指南
  • 代码笔记插件
  • 跟着 Lua 5.1 官方参考文档学习 Lua (3)
  • 【HarmonyOS Next】鸿蒙应用进程和线程详解
  • WSL2使用Kind创建K8S集群时出现IPV6网络创建失败
  • Java 面试笔记 - Java基础
  • vue组件二次封装
  • 关于redis的主从复制(下)
  • 【深度学习在图像配准中的应用与挑战】
  • 详细介绍Tess4J的使用:从PDF到图像的OCR技术实现
  • Nacos Derby 远程命令执行漏洞修复建议
  • DeepSeek学习资料
  • 强化学习-价值学习算法
  • 巴总理召开国家指挥当局紧急会议
  • 印度一战机在巴基斯坦旁遮普省被击落,飞行员被俘
  • 中俄就应对美加征所谓“对等关税”等问题进行深入交流
  • 可量产9MWh超大容量储能系统亮相慕尼黑,宁德时代:大储技术迈入新时代
  • 新买宝马竟是“维修车”,男子发视频维权被4S店索赔100万
  • 牛市早报|国家发改委:今年将推出约3万亿元优质项目,支持民营企业参与