前段项目中用到了触摸屏,驱动已经做好,需要做一个触摸屏插件供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文件,如下:
刚开始编译可能会有很多错误,要把其中的private目录下的头文件要么换掉,要么注释掉,但是最后还是有个mtdev.h找不到,最后的解决办法是从网上下载了一个mtdev-1.1.5.tar.gz源码,编译mtdev,其中configure配置
LIBS += -L /home/kenny/tp_plugins/evdevtouch -lmtdev
这个因为每个人的环境不一样,要确保能够找到,我在刚开始写错了这个路径,结果总是编译出错。
编译完毕,libqevdevtouchplugin.so就生成了。
(2)libqevdevtouchplugin.so的使用
使用这个插件时发现,必须将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下)