您的位置:首页 > 编程语言 > Qt开发

Qt libqevdevtouchplugin.so插件的改写

2015-07-24 15:32 489 查看
前段项目中用到了触摸屏,驱动已经做好,需要做一个触摸屏插件供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配置

./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下)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: