Qt-4.8.4使用电容触摸屏
来源:互联网 发布:图片浏览软件 编辑:程序博客网 时间:2024/06/06 00:13
经过上一篇文章提到的方式,发现这不是我想要的。十分的纠结。为什么就用不了usb接口的触屏呢!?
我使用的是15寸的触摸屏,当使用10寸屏的时候,是没有问题的。到了15寸就完全废掉了,我使用示波器做过测试,因为使用的芯片支持触屏接口,所以触屏是直接连接到芯片上面的。但是芯片的电压是3.3v的,我认为就是因为电压太低了,不足以满足15寸的电阻屏,个人愚见。如果有那位仁兄仁姐实现了,小弟求教。后来又想过自己修改tslib来适应usb接口的电阻屏,因此看了好几天的tslib的源码,在我想来是可以实现的。如果什么也不更改,直接把环境变量
<span style="white-space:pre"></span>export QWS_MOUSE_PROTO="LinuxInput:/dev/input/event2改成这样,会提示 selected device is not a touchscreen I understand。网上找到问题的关键是,在tslib的源码中有如下代码:
<span style="color:#666666;">if (! ((ioctl(ts->fd, EVIOCGVERSION, &version) >= 0) &&(version == </span><span style="color:#ff0000;">EV_VERSION</span><span style="color:#666666;">) &&(ioctl(ts->fd, EVIOCGBIT(0, sizeof(bit) * 8), &bit) >= 0) &&(bit & (1 << EV_ABS)) &&(ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit) * 8), &absbit) >= 0) &&(absbit & (1 << ABS_X)) &&(absbit & (1 << ABS_Y)) && (absbit & (1 << ABS_PRESSURE)))) {fprintf(stderr, "selected device is not a touchscreen I understand\n");return -1;}</span>红色部分是其中一个原因,这个东西需要修改编译器中的宏定义,把#define EV_VERSION 0x010001 改成#define EV_VERSION 0x010000。当然,上述修改是针对电阻屏接口好用,但是对于usb接口的还是不行,其他判断条件同样需要修改。上述代码在tslib源码的Input_raw.c文件check_fd()函数中。后来因为个人水平有限,不知道直接屏蔽check_fd会有什么后果,所以作罢。不过一点经验是,触摸屏接口是12位的,最大数据2047,而usb接口最大数据是4095,需要修正一下,另外数据传输的顺序也有要求,先ABS_X,然后ABS_Y,最后ABS_PRESSURE。这个先放放,以后在研究吧!
后来又买了一块电容屏,支持多点触摸的。这个东西就更复杂了,是关于HID(human interface Device)驱动的,完全不懂了,不过倒是可以使用。
参考博客http://blog.csdn.net/laohuang1122/article/details/8313578对Qt进行重新编译,使其支持LinuxInput输入方式,内核也需要重新编译,如果之前不支持的话,需要driver->HID Support->HID Multitouch好像是这个,然后当你插入usb的电容屏时,在dev/input下面会出现相应的设备节点。电容屏本身是不需要校准的,不过和Qt配合的话就需要重新校准,Qt本身提供了一个校准软件,只能支持Embedded Linux软件叫做mousecalibration,在example->qws目录下面。这也出现了问题,可以完成校准,不过不知道是我的问题还是什么,校准后,触摸屏的左上四分之一就代表显示器全屏了,就是从触屏左上角移动到大概中心位置,鼠标指针就已经从显示器左上角,移动到右下角了。很奇怪,查看了Qt的源码,里面关于calibrate的代码,文件是src/gui/embedded/qws/qmouse_qws.cpp,代码如下:
void QWSCalibratedMouseHandler::calibrate(const QWSPointerCalibrationData *data){ // Algorithm derived from // "How To Calibrate Touch Screens" by Carlos E. Vidales, // printed in Embedded Systems Programming, Vol. 15 no 6, June 2002 // URL: http://www.embedded.com/showArticle.jhtml?articleID=9900629 const QPoint pd0 = data->devPoints[QWSPointerCalibrationData::TopLeft]; const QPoint pd1 = data->devPoints[QWSPointerCalibrationData::TopRight]; const QPoint pd2 = data->devPoints[QWSPointerCalibrationData::BottomRight]; const QPoint p0 = data->screenPoints[QWSPointerCalibrationData::TopLeft]; const QPoint p1 = data->screenPoints[QWSPointerCalibrationData::TopRight]; const QPoint p2 = data->screenPoints[QWSPointerCalibrationData::BottomRight]; const qint64 xd0 = pd0.x(); const qint64 xd1 = pd1.x(); const qint64 xd2 = pd2.x(); const qint64 yd0 = pd0.y(); const qint64 yd1 = pd1.y(); const qint64 yd2 = pd2.y(); const qint64 x0 = p0.x(); const qint64 x1 = p1.x(); const qint64 x2 = p2.x(); const qint64 y0 = p0.y(); const qint64 y1 = p1.y(); const qint64 y2 = p2.y(); qint64 scale = ((xd0 - xd2)*(yd1 - yd2) - (xd1 - xd2)*(yd0 - yd2)); int shift = 0; qint64 absScale = qAbs(scale); // use maximum 16 bit precision to reduce risk of integer overflow if (absScale > (1 << 16)) { shift = ilog2(absScale >> 16) + 1; scale >>= shift; } s = scale; a = ((x0 - x2)*(yd1 - yd2) - (x1 - x2)*(yd0 - yd2)) >> shift; b = ((xd0 - xd2)*(x1 - x2) - (x0 - x2)*(xd1 - xd2)) >> shift; c = (yd0*(xd2*x1 - xd1*x2) + yd1*(xd0*x2 - xd2*x0) + yd2*(xd1*x0 - xd0*x1)) >> shift; d = ((y0 - y2)*(yd1 - yd2) - (y1 - y2)*(yd0 - yd2)) >> shift; e = ((xd0 - xd2)*(y1 - y2) - (y0 - y2)*(xd1 - xd2)) >> shift; f = (yd0*(xd2*y1 - xd1*y2) + yd1*(xd0*y2 - xd2*y0) + yd2*(xd1*y0 - xd0*y1)) >> shift;<p> writeCalibration();</p>}
这个东西QWSPointerCalibrationData,里面只定义了两个数组,devPoint和screenPoint,这个是我不太懂的地方,devPoint是代表触摸屏上面的点,screenPoing代表的是显示器上面的点。这是通过mousecalibration这个软件的源代码推出来的。
对于calibrate只需要显示器和触摸屏上面,左上、右上和右下几个点就可以了。看着很简单。但是我通过自己设置一些调试信息,发现进入软件后,按触摸屏的中心点靠右和靠下的部分,分别是(799,*)和(*,599),而如果触摸右下角部分就直接是(799,599)。不知道是什么原因,我猜想可能是内核传递上来的数据,对于Qt的QWSserver来说太大了。才出现这样的问题,具体还没找到原因。所以屏幕还不是特别好用。如果有明白的仁兄仁姐,请不吝赐教。以上仅做参考,欢迎交流讨论。
- Qt-4.8.4使用电容触摸屏
- QT 4.8.5支持电容触摸屏 和 鼠标
- 电容触摸屏
- 电容触摸屏
- 电阻触摸屏电容触摸屏触摸屏
- Android电容触摸屏驱动
- 电容触摸屏初探
- 电容触摸屏驱动分析
- 触摸屏--电容屏
- 电容感应触摸屏工作原理
- 电容触摸屏驱动---基于FT5406
- 电容屏改为单点触摸屏
- 电容触摸屏驱动---基于FT5406
- 手机电容触摸屏技术简介
- 电容触摸屏驱动---基于FT5406
- 电容触摸屏驱动---基于FT5406
- 手机电容触摸屏技术简介
- 电容触摸屏驱动---基于FT5406
- 欢迎使用CSDN-markdown编辑器
- Linux 技巧:让进程在后台可靠运行的几种方法
- ubuntu通过windows下的ccproxy代理上网
- java中两个字符串如何比较大小
- flex类似HashMap工具
- Qt-4.8.4使用电容触摸屏
- 修改 Ubuntu ulimit 限制
- Java学习笔记之异常
- 黑马程序员--代码实现2 多态
- flex AdvancedDataGrid 某行指定值变颜色
- GIT基本概念和用法总结
- Spring事务管理—aop:pointcut expression解析
- Android使用FileInputStream和FileOutputStream进行文件I/O操作
- 提高第29课时,自测