Qt libqevdevtouchplugin.so插件的改写

        前段项目中用到了触摸屏,驱动已经做好,需要做一个触摸屏插件供ui调用,在网上查到了很多资料都是关于tslib的移植,由于之前键盘插件的开发是在qt官方提供的插件源码上修改的,这次也尝试着去改官方插件(不知道官方插件为什么不能直接用?可能跟驱动有关?)。


(1)libqevdevtouchplugin.so的编译 

Qt\5.2.1\Src\qtbase\src\plugins\generic可以看到键盘、鼠标、触摸屏等常用设备的插件工程,根据这里的文件找到相关的工程文件(好多都是搜出来的),修改qevdevtouch.cpp文件在QEvdevTouchScreenHandler类的构造函数,这里直接将dev写死了,qt自带的deviceDiscovery函数试了,但是没有找到设备,如果能用官方的插件也不用费这么大劲去改了。。。

dev = "/dev/event1";
qDebug()<<"dev--------------------"<<dev;

同时添加打印信息。

修改pro文件,如下:

      Qt libqevdevtouchplugin.so插件的改写_第1张图片

刚开始编译可能会有很多错误,要把其中的private目录下的头文件要么换掉,要么注释掉,但是最后还是有个mtdev.h找不到,最后的解决办法是从网上下载了一个mtdev-1.1.5.tar.gz源码,编译mtdev,其中configure配置

./configure   --build=i386-linux --host=arm-linux --prefix=./_install
刚开始使用了
./configure --build=i386-linux CC=arm-linux-gcc
未用host指定运行平台,编译时出现了格式不正确的的问题。接着:
make
make install
编译后将头文件放了进来,但是这样还是出问题,因为mtdev的库文件没有加进来,于是在pro文件里指定了库文件的目录

LIBS += -L /home/kenny/tp_plugins/evdevtouch -lmtdev

这个因为每个人的环境不一样,要确保能够找到,我在刚开始写错了这个路径,结果总是编译出错。

编译完毕,libqevdevtouchplugin.so就生成了。


(2)libqevdevtouchplugin.so的使用

首先在环境变量中加入触摸屏插件的名称,source /etc/profile使环境变量生效
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin/
export LD_LIBRARY_PATH=/qt/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=/qt/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0:nographicsmodeswitch
export QT_QPA_FONTDIR=/qt/lib/fonts
export QT_QPA_GENERIC_PLUGINS=EvdevKeyboard,EvdevTouch
然后将 libqevdevtouchplugin.so 拷到/qt/plugins/generic下面

使用这个插件时发现,必须将libmtdev*.so相关文件放到ui同级目录,或者将它们放在/qt/lib下面(环境变量里指定了库文件路径为/qt/lib)


(3)运行ui测试,主函数如下

#include "mainwindow.h"
#include <QDebug>
#include <QEvent>
#include <QTouchEvent>
#include <QCoreApplication>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    resize(800, 480);
    setAttribute(Qt::WA_AcceptTouchEvents, true); //这个必须要写
    QCoreApplication::setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents, true);
}

bool MainWindow::event(QEvent *event)
{
    qDebug()<<"event->type():"<<event->type();
    if (event->type() == QEvent::TouchUpdate)
    {
        qDebug()<<"QEvent::TouchUpdate";
    }

    if (event->type() == QEvent::TouchBegin)
    {
        qDebug()<<"QEvent::TouchBegin";
        event->accept();
    }

    if (event->type() == QEvent::TouchEnd)
    {
        qDebug()<<"QEvent::TouchEnd";
    }
    return 0;
}

MainWindow::~MainWindow()
{
}

这样,刚刚在插件里添加的打印信息就可以显示了,可以收到TouchBegin和TouchUpdate,但是不知道为什么TouchEnd收不到,这个问题还需要查查。有机会尝试下tslib的移植~(注:本文所有编译都是在linux下)


你可能感兴趣的:(Qt libqevdevtouchplugin.so插件的改写)