今天遇到一个问题,客户想要在选取图片时能够支持single-tap ,即单击一个就代表选择,而不用像以前那样单击一次代表选中,再单击一次才代表选择。
在symbian平台中我们可以直接用在AppUi调用BaseConstructL函数来开启,就像下面这样:
但在Qt平台中,由于UI的启动直接被封装起来,也没有接口供我们调用,这时让我们开启single-tap简直有点不可能。
让我们先来看看Qt中是怎么写的:
看到没?全是写的死死的。其实就是在symbian也没有可以修改flags的接口,只有查询的接口,你可以调用IsSingleClickCompatible(),IsTouchCompatible()等来查询,但没有修改的接口。
怎么办呢?看起来简单就是不可能了。
看看symbian的源码吧,也许可以找到出路。
哦,原来管Single-tap的就是下面这句了:
如果我们能获得iAknFlags就好办了,可是symbian并没有提供接口给我们。嘿嘿,不过我们还是有办法的,
那就是指针,CAknAppUiBase的运行时的实例我们是可以获得的,只要我们可以算出iAknFlags在CAknAppUiBase类中的位置,用指针只向它不就可以了嘛。
哈哈,真是无所不用其极啊。
让我们看看如何能指向它呢,经过计算得出如下代码(注意这里使用的是GCC编译器):
18就是iAknFlags在CAknAppUiBase类中的offset了,iAvkonAppUiBase我就不用说了。
这样我们就顺利得到了flags,修改它就很容易了,通过以下代码我们就可以开启single-tap了:
其中14是根据symbian源码中找到的对应数字,这里你也可以用enum,这样看起来可读性会更好一些。
以上是解决symbian开发中解决问题的一个思路,虽然看起来并不是那么的友好,但实在是没有办法啊,symbian没有公开的API接口,
同时Qt也不够完善,但我们的项目还是要做的,用邓爷爷的话说能抓到老鼠的猫就是好猫,哈哈。其实在我们探究出这个方法的过程中我们也可以学到很多
既熟悉了symbian源码又增进了对C++的认识,不是嘛,哈哈。