注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

ARM学习(四十)QT程序移植到开发板2  

2010-06-23 21:34:48|  分类: ARM学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

从周一开始编写并编译QTE的键盘中间件,依据着原来的文档和在网上的资料,发现网上的资料大多是针对QTE2系列的,程序虽然原理相同,但很多的地址和函数及特定的方法都已经或多或少的有些改变,这里记下来,为QTE4.5做一个备忘。
首先是在QTE的源文件里找到src/gui/embedded这个路径(而网上资料则不是这个路径,我也是在别人搜索时发现,可恨的在我的机器上竟然没有),在这个路径下建立你的键盘中间文件,建立你自己的类,从QWSKeyboardHandler下继承而来,(有没有Q_OBJECT),这里需要提一下的是,要认真看这个路径下的别的程序,特别是那个qkbdvr41xx_qws.h和qkbdvr41xx_qws.cpp文件,我们可以依照这两个文件,自己写一个文件。我仔细看了原来的文档和这两个文件,发现这里利用指针的相互定义,实现了调用QWSKeyboardHandler类里的processKeyEvent函数的功能,特别指出的是,里面的键值是int型,这个函数提供了QTE中的keypressevent个事件的过滤功能。也就是说,如果没有这一步,键盘事件的分发在QTE里是不可能实现的。
需要注意的,这里利用两个文件实现了两个类,而我们继承来的类主要是提供一个接口,而真正的操作读写LINUX内核驱动的是新建立的一个PRIVATE的自己的类,你可以仿照qkbdvr41xx_qws.cpp这个里面的把自己的类实现,这个很简单,其实主要是重写一个readKeyboardData(),在此处我们实现读写内核驱动的COPY到用户空间的键盘码。这里的键盘码可以是自定义也可以是标准的ASCII码。这里有一个注意的地方是你一定要实现Q_OBJECT,因为这里使用了槽。
然后我们OPEN打开在LINUX内核里的键盘驱动,(这里假定你已经正确的完成并测试成功这个驱动),这里需要注意的是,因为版本升级的原因,latin1这个函数已经被 toLatin1 代替,而在OPEN时候,如果不进行设备名,会报一个QString 无法转换到Qchar*的错误,这在低版本是自动强制转换的。这里你可以使用其它程序中的转换方法,即QString.toLatin1().constData(),记得不要丢掉括号,否则报一个模板无法找到的错误,英文的记不清了。
然后在qkbddriverfactory_qws.cpp中的QWSKeyboardHandler *QKbdDriverFactory::create()注册自己的键盘类,照着上面的写即可,类似于下面
#ifndef QT_NO_QWS_KBD_XXX //chgw 20070805

    if ( driver == "你的键盘驱动名称" || driver.isEmpty() )

return new QWSXXXKeyboardHandler( device );

#endif
然后我们再更新qt_embedded.pri使得QT/Embedded,在里面加上自己的头文件和CPP文件,这样就可以保证在编译时正确的编译自己写的文件,并将其打包到QTE中去。至于如何加进去,可打开文件,照着写就可以了,注意要在下面的CONTAION中也注册一下自己的驱动,方法也一样,拷过来,改就可以了。
这里有一个小教训,我为了看程序方便,打开这些文件时用的是写字板,结果在拷贝时造成文本有误,编译时出现几百个警告,而且也找不到原因,亏得以前在VS中有过类似的教训,很快得以解决,所以在跨平台工作中,尽量使用文件或者VS来操作,这个东西是不错的,不要乱沾其它格式里的数据文件,否则一旦有问题,只好重新再写一次。

暂时还没编译成功,所以下来接着再写。
经过两天测试,编译成功,出现的主要错误表现为编译过程中要修改根路径下的CONFIGURE,在里的-qt-kdb-<drivers>里面的环境变量设置里增加你自己定义的键盘名称,这里为XXX,否则会报没有这个参数设置,然后退出来,进入编译后主要是自己写的两个类的函数重复定义,这时只要按照例子写好预定义宏即可,即里面的#if !defined XXX,注意,我在这里这样定义后会在编译到接近最后时报一个.O文件里这些函数重命名的错误,我在这里考虑了很久,因为人家别的驱动例程里并没有定义这个宏,却可以编译过去,我一直到现在都不是很明白,但从C++的机理上考虑,这里应该是没有定义这个宏,我于是定义了这个宏,就成功编译过去了。
我一直不明白在哪里采用多态机制调用的这些虚拟函数,直到在qwindowsystem.cpp里发现了,openkeyboard这个函数,在这个函数里,他用一个getenv这个C的标准库函数打开一个QWS_KEYBOARD这个环境变量,我才明白,联想到在RCS这个文件里设置这个环境变量为自己定义的XXX,并且指定其地址,才彻底的明白了怎么回事儿,但现在程序还有一个小问题,就是一直无法获取键值,不知道什么原因,可能是仍然有地方的设置有错误,理论上讲,程序驱动应该没有什么错误了,关键是看配置的正确与否了,有时间与高手再请教一下,或者再认真翻一下资料,要努力啊。

  评论这张
 
阅读(1160)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017