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函数试了,但是没有找到设备,如果能用官方的插件也不用费这么大劲去改了。。。
同时添加打印信息。
修改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测试,主函数如下
这样,刚刚在插件里添加的打印信息就可以显示了,可以收到TouchBegin和TouchUpdate,但是不知道为什么TouchEnd收不到,这个问题还需要查查。有机会尝试下tslib的移植~(注:本文所有编译都是在linux下)
(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下)
相关文章推荐
- 学习qt遇到不显示菜单栏
- Qt5 设置QLabe中字体的颜色
- Qt网络编程之一
- Qt下写日志文件的函数
- QT分析之网络编程(一)
- qt QLineEdit 左侧带自定义图标类
- 3. QT窗体间值的传递(续)
- pyqt的多Button的点击事件的槽函数的区分发送signal的按钮。
- qt在开发板上运行的环境编译的搭建
- Qt开源的压缩包的提取
- QT—QTextEdit控件显示日志
- Qt 中响应回车事件 keyPressEvent
- QT定制有标题的扁平化下拉框控件
- QT中调用JAVA代码
- QT中的.pro文件
- QT QSS 使用
- QT打包发布NSIS
- QT打包发布
- VS中Qt的探索02
- Qt中多事件使用实例