这篇文章主要介绍编写方法,非提供触摸屏的输入处理过程。
大多数编写Plugin 的方法无非如下:
一 编写插件
编写一个Qt的插件需要以下步骤
1.声明一个插件类,
2.定义一个类,实现这个插件类定义的接口,定义的这个类必须从QObject集成下来。
3.使用Q_INTERFACESQ_INTERFACES()告知Qt的元系统这个接口的存在
3.使用宏Q_EXPORT_PLUGIN2()来导出插件的接口
4.编写插件类的.pro文件
pro工程文件的编写
TEMPLATE = lib
CONFIG += plugin
HEADERS = custommousedriver.h \
customMouseDriverPlugin.h
SOURCES = custommousedriver.cpp \
customMouseDriverPlugin.cpp
TARGET = customMouseDriverPlugin
其中,值得注意的是:环境变量
export QT_PLUGIN_PATH=/qt/lib/plugins
exportQWS_MOUSE_PROTO=customMouseDriverPlugin :/dev/input/TouchScreen
export QT_DEBUG_PLUGINS=1(这个是为了让QT加载Plugin时,输出调试信息,让我们明确到底是哪里出了问题。真的非常有用,不信,你就慢慢纠结吧O(∩_∩)O~)
Q_EXPORT_PLUGIN2宏让Qt知道该类是一个插件。如:
Q_EXPORT_PLUGIN2(customMouseDriverPlugin , CCustomMouseDriverPlugin);
第一个参数是插件的名字;这个基本名要和.pro指定的TARGET项保持一致,并且和环境变量QWS_MOUSE_PROTO中的driver内容一致(也就是customMouseDriverPlugin :/dev/input/tsdev);对了,也要跟你实现的keys()函数返回的字符串一致哦(反正一样总没错,减少出错率)。第二个参数是插件的类名。我们使用宏Q_EXPORT_PLUGIN2,输出插件,让插件变得可以被QT使用。
大部分过程是类似的,这里主要讲下我们让QT加载自己编写的Plugin库时遇到的问题。
我们常常遇到自己编写完库,然后根据QT帮助文档中的提示将它放到QT对应的Plugins的mousedrivers下,然后运行我们的测试程序,但是一直没办法跑到我们在内部做的调试信息里。所以不得不怀疑到底是我们的程序有问题,还是放置的目录错误了?
这里我们可以看下输出的调试信息。我遇到的问题调试信息如下:
QFactoryLoader::QFactoryLoader() looking at "/phone/lib/plugins/mousedrivers/libcustomMouseDriverPlugin .so"
"Cannot load library /phone/lib/plugins/mousedrivers/libcustomMouseDriverPlugin .so: (/phone/lib/plugins/mousedrivers/libcustomMouseDriverPlugin .so: undefined symbol: _ZQL33MouseInputHandlerPrivate)"
could not load 。
我就大大的不爽了,编译都正常,怎么可能会在加载时提示没定义呢。我勒个去啊,幸亏我查看了其他输入设备的QT源代码(其实我的驱动代码差不多跟源码类似啦,只是输入部分自己处理了下。),比对了良久(真心有点久啊),终于发现原来要在自定义文件custommousedriver.cpp 尾部增加,#include “xxx_moc.h” xxx可以自定义,然后用对应编译器qmake生成下,会自动生成你包含的那个xxx_moc.h的。具体原理,没去深究,有探索精神的同学可以研究下,再来分享哦,然后make,再来一次加载,OK了,诸神保佑啊。
转载记得注明出处啊。感谢啦。毕竟是自己的一点学习心得,供大家借鉴。不足之处,慢慢纠正。