触摸笔的底层可以采用tslib。
在qte中,对tslib对应的device (/dev/ts)设一个QSocketNotifier, 监视tslib事件。当有触摸笔按下时,产生signal, 读取mousedata, 获得press值、坐标、时刻。press非0表示按住, 为0表示release。通过时刻可以判断是否双击。
这里需要注意的问题之一是触摸笔的精度问题。 长按触摸笔或者划线条的时候,读取的坐标值有可能漂移。需要做个误差处理。
此外,不同的应用场合,需要处理不同的mouse事件。 比如editor可能需要长按后,模拟右键,弹出复制粘贴菜单, 有的应用希望长按的时候按 repeat 来处理。
记住,有的设备是不可能产生long press或者repeat press事件的。比如手机上的roller。所以有些功能,不要设计成只依赖long press/repeat press, 这样将导致这些功能不可通用。
qtopia2本身没有实现 long press 产生右键、复制粘贴等功能。可以进行修改获得:
qwsmouse_qws.cpp文件中, readMouseData 函数中, 增加 发现 long press后,产生一个右键的处理。
QWSServer将mouse event放到event队列中。
根据对应的QWidget,调用其translateMouseEvent 方法。在translateMouseEvent函数中,会对mouse events进行压缩处理。 比如触摸笔划动,本来会产生 press, press,press.... realease, 会被压缩成press , mouse move, release 三个event来处理。
此外每第一次press event,实际上是按 move event + press event来处理的。也就是press event的新老坐标都是相同的。在右键和左键两个事件中,qt会自动插入一次release事件。详细见dispatchMouseEvent函数。
editor 对右键的复制粘贴功能,可以修改QLineEdit和 QMultiLineEdit两个类实现。如果你正确理解了上面mouse event的转换,修改应该不难。