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

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更新到系统镜像;


http://www.kler.cn/a/557729.html

相关文章:

  • 3.Docker常用命令
  • 深入解析设计模式之单例模式
  • DeepSeek与AI幻觉
  • LlamaIndex中使用本地LLM和Embedding
  • 图表控件Aspose.Diagram入门教程:使用 Python 将 VSDX 转换为 PDF
  • QEMU源码全解析 —— 内存虚拟化(17)
  • LeetCode 热题 100 283. 移动零
  • 【JT/T 808协议】808 协议开发笔记 ② ( 终端注册 | 终端注册应答 | 字符编码转换网站 )
  • 软件集成测试的技术要求
  • AF3 _parse_template_hit_files类解读
  • python使用httpx_sse调用sse流式接口对响应格式为application/json的错误信息的处理
  • 零基础学QT、C++(六)制作桌面摄像头软件
  • 计算机考研复试上机07
  • EVM系区块链开发网节点搭建及测试详细文档
  • unordered_map和 unordered_set
  • 20250221 NLP
  • 基于C++ Qt的图形绘制与XML序列化系统
  • HW面试经验分享 | 北京蓝中研判岗
  • 【Java】File 类
  • 水果生鲜农产品推荐系统 协同过滤余弦函数推荐水果生鲜农产品 Springboot Vue Element-UI前后端分离 代码+开发文档+视频教程