树莓派触摸屏校准以及QT触摸屏相关问题解决

树莓派触摸屏校准以及QT触摸屏相关问题解决

  • 前言
    • 树莓派触摸屏校准
    • QT触摸屏校准

前言

本人之所以写这篇论文,是因为在项目过程中做QT界面的校准时遇到了很多问题,在查找资料与自己摸索后想整理下这边相关的解决方法。

树莓派触摸屏校准

在进行屏幕旋转或者触摸屏初始触摸位置不正确的时候需要进行的操作。
其中一种方法是使用xinput_calibrate工具进行屏幕校准。

sudo apt-get install xinput_calibrator ##下载
xinput_calibrator ##运行

xinput_calibrator后 ,工具会提示你电机红色十字架校对点。 然后反馈输出类似:
Calibrating EVDEV driver for “eGalax Inc. USB TouchController” id=8
current calibration values (from XInput): min_x=1938, max_x=114 and min_y=1745, max_y=341
Doing dynamic recalibration:
Setting new calibration data: 121, 1917, 317, 1741
–> Making the calibration permanent <–
copy the snippet below into ‘/etc/X11/xorg.conf.d/99-calibration.conf’
Section “InputClass”
Identifier “calibration”
MatchProduct “eGalax Inc. USB TouchController”
Option “Calibration” “121 1917 317 1741″
Option “SwapAxes” “1″
EndSection

按照提示 复制Section信息 到 /etc/X11/xorg.conf.d/99-calibration.conf
树莓派写的文件可能有所区别,我写的位置是 /etc/X11/xorg.conf.d/10-evdev.conf
reboot 可以了

QT触摸屏校准

当你翻转屏幕后进行系统的触摸屏校准,打开QT界面时,会发现QT里面的触摸屏还是没有校准前的状态(即你实际点的位置与响应位置成中心对称或者其他状态)。我认为是QT直接读取触摸屏事件的坐标值,而不是校准后的值,而如何去读校准后的值我始终没有找到方法。但是QT官方提供了解决方法。

/dev/input/… - Specifies the name of the input device. When not given, Qt looks for a suitable device either via libudev or by walking through the available nodes.
rotate - On some touch screens the coordinates must be rotated, which is done by setting rotate to 90, 180, or 270.
invertx and inverty - To invert the X or Y coordinates in the input events, pass invertx or inverty.

比如说,点击位置与响应位置成中心对称,你可以将下面这条环境变量写入/etc/profile文件中

export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event5:rotate=180

/dev/input/event* 你可以使用cat /proc/bus/input/devices命令查看触摸屏对应的事件。

好了,如果你的触摸屏原本触摸点没有偏差的话,这些操作就可以解决你的问题了。但是,如果你的触摸屏原本就是不准的,例如你点下去,响应的位置在你点的位置的下方,光通过环境变量进行翻转就不行了。

有一个方法就是利用tslib库的支持了。下载的话可以去tslib的在github的官方地址去下载。安装好后
https://github.com/kergoth/tslib

我们使用tslib里的ts_calibrate进行触摸屏校准,按提示依次点屏幕上的五个十字框即可,然后我们需要使用命令

ts_uinput -d -v

生成一个虚拟的触摸屏事件ts_uinput,然后需要在/etc/profile中添加环境变量

export TSLIB_ROOT=/usr/local/tslib ##tslib库放置的位置
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
export TSLIB_TSDEVICE=/dev/input/event3 ##你的触摸屏事件号
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event4 ##生成的虚拟触摸屏事件号

但是这里有出现一个问题。由于你生成了一个虚拟触摸屏事件,然后系统自己也有一个触摸屏事件,这个时候便可能存在两个触摸屏事件,也就是说你点击触摸屏其实有两个事件相应。这时候你可以修改X-Window的配置信息/usr/share/X11/xorg.conf.d/10-evdev.conf,将图中带“touchscreen”那一段中的红框event*改为你的虚拟触摸屏事件ts_uinput的event号即可。这样就只有一个触摸屏在相应操作了。
树莓派触摸屏校准以及QT触摸屏相关问题解决_第1张图片

你可能感兴趣的:(树莓派,触摸屏,QT,校准)