Qt使用电容屏

Qt 5.x 相对于 4.8 及以前版本在窗口系统上有较大幅度改动,原来的 QWS 被 QPA 完全取代,导致输入设备配置简化了很多,执行界面程序也不需要再加上-qws。

1、找到触摸屏event

用的 USB 接口驱动触摸屏,当你插入 usb 的电容屏时,在 dev/input 下面会出现相应的设备节点。假如cat /dev/event0,触摸屏幕有乱码输出,则说明 usb 触摸屏驱动产生中断并且将采集数据上报 input 子系统了。

另外也可以使用 hexdump 命令,它是 Linux 下的一个二进制文件查看工具,它可以将二进制文件转换为 ASCII、八进制、十进制、十六进制格式进行查看,默认显示十六进制格式,使用 -d 命令参数显示十进制,详细使用参考:Linux命令学习总结:hexdump

使用 hexdump 命令查看触摸信息,快速触摸屏幕右下角后的打印信息如下:

$ hexdump -d /dev/input/event0
0000000   15989   00000   18969   00004   00004   00004   00001   00009 # 其它事件
0000010   15989   00000   18969   00004   00001   00272   00001   00000 # BTN_MOUSE,按下
0000020   15989   00000   18969   00004   00003   00000   16333   00000 # ABS_X
0000030   15989   00000   18969   00004   00003   00001   09599   00000 # ABS_Y
0000040   15989   00000   18969   00004   00000   00000   00000   00000 # 同步事件
0000050   15989   00000   49415   00005   00004   00004   00001   00009 # 其它事件
0000060   15989   00000   49415   00005   00001   00272   00000   00000 # BTN_MOUSE,松开
0000070   15989   00000   49415   00005   00000   00000   00000   00000 # 同步事件

倒数第四、三、二行分别为 type、code 和 value,在 linux/input.h 都有定义,Linux 中输入设备的事件类型有:

#define EV_SYN 0x00 // 同步事件
#define EV_KEY 0x01 // 按键事件
#define EV_REL 0x02 // 相对坐标
#define EV_ABS 0x03 // 绝对坐标
#define EV_MSC 0x04 // 其它事件
  • type 是事件类型,为 3 就是 EV_ABS=0x03,为 0 就是 EV_SYN=0x00(作为事件的分隔)。
  • code 的话根据事件类型而定,如果是 type 为 EV_ABS,code 为 0 就是 ABS_X,code 为 1 就是 ABS_Y。
  • 然后 value 就是在 type 和 code 的前提下的值,比如 type 为 EV_ABS,code 为 0 就是 ABS_X,那么 value 就代表触摸点的 x 轴绝对值。
  • 比如 type 为 EV_KEY,code 为 272 就是 BTN_MOUSE,code 为 330 就是 BTN_TOUCH,那么 value 为 1 表示按下,为 0 表示松开。比如 type 为 EV_ABS,code 为 24 就是 ABS_PRESSURE,value 为 1 表示按下,为 0 表示松开。

测试看出触摸屏触摸产生的坐标值范围为 X:016384,Y:09600,同时该触摸屏没有上传 ABS_PRESSURE。

通过 cat /proc/bus/input/devices 应该就能够看到触摸设备的相关信息。比如:

$ cat /proc/bus/input/devices
I: Bus=0003 Vendor=222a Product=0001 Version=0110
N: Name="ILITEK ILITEK-TP"
P: Phys=usb-11000000.xhci-1.4/input1
S: Sysfs=/devices/soc/11000000.xhci/usb1/1-1/1-1.4/1-1.4:1.1/0003:222A:0001.0004/input/input2
U: Uniq=
H: Handlers=mouse0 js0 event0
B: PROP=0
B: EV=1b
B: KEY=1f0000 0 0 0 0 0 0 0 0
B: ABS=3
B: MSC=10

上面的信息有触摸屏 vid,pid,版本等,以及 ABS 表示触摸屏的绝对坐标掩码,掩码上面表示 16 进制,所以 3=0x0000003=0000 0000 0000 0000 0000 0000 0011,其中为 1 的比特的位置就表示触摸屏会报告这一类型的事件,前面的 bit0 和 bit1,那么看 linux/input.h 文件就表示事件 code 码有 ABS_X=0x00 , ABS_Y=0x01, 这两个分别表示触摸屏报告触摸的 x 坐标,y 坐标。而 bit24 为 0,则表示触摸屏驱动没有上传 ABS_PRESSURE。

Qt使用电容屏

使用电容屏的 Qt 程序,不用移植 tslib 库,就可以直接读取输入设备文件(/etc/input/eventx),除非需要 tslib 校准。另外 Qt4 默认支持触屏,而 Qt5 需要设置环境变量才能支持触屏:

export QT_LOGGING_RULES=qt.qpa.input=true # 打印触屏信息
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0 # 指定输入设备的名称
export QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0 # 将触摸屏的点击事件配置成Qt的鼠标点击事件
export QT_QPA_FB_HIDECURSOR=1 # 为1则隐藏鼠标光标,为0则显示鼠标光标
  • 对于 Qt5,设置环境变量QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS
    ,Qt5 自身的 libinput 就会去/dev/input/eventX读取触摸屏数据(未校准),从而使触摸正常工作。
  • 将触摸屏的点击事件配置成 Qt 的鼠标点击事件后,会产生有一个鼠标光标。

电容屏的校准

触摸屏配置可分两种方式,一种是电容屏或由驱动校准的电阻屏配置,另一种是需要借助 tslib 校准的电阻屏配置。

所以电容屏本身是不需要校准的,不过和 Qt 配合的话就需要重新校准:

1、Qt 本身提供了一个校准软件,叫做 mousecalibration,不过只能支持 Embedded Linux(嵌入式 Linux),软件在 example->qws 目录下面,可以完成校准。但是由于不同的嵌入式平台采用的芯片差异性很大,所以这个校准程序往往无法使用。其详细说明参考:Mouse Calibration Example

2、使用 tslib校准:带 tslib 校准的方式需要移植最新版 tslib 库,再编译 Qt 源码或插件(Qt 自带的插件可以单独编译,自带插件不支持多点触摸),编译时加入 tslib 到编译选项。移植到嵌入式设备后,配置 tslib 校准服务开机启动,之后配置 Qt 宏默认使用 tslib 插件作为默认输入插件。

校准原理说明

分辨率转化和校准
其实触摸屏触摸产生的坐标值是绝对坐标,范围为 X:016384,Y:09600。所以,我们运行的 Qt 程序如果直接获取 /dev/input/eventx 产生的坐标的话,鼠标位置便会超出屏幕的显示范围(1920*1080),因此,我们需要进行一下坐标值转化。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt是一个跨平台的GUI库,常用于开发桌面应用程序。在多环境下,Qt可以很好地支持幕缩放比例。 对于多环境,Qt提供了一种简单的方法来访问所有幕,并且多个幕可以在Qt中作为一个具有单一逻辑大小的桌面表现。Qt 5中提供了两种方法来实现幕缩放比例:DPI缩放和UI缩放。 DPI缩放是指Qt通过重新计算每个幕上的像素密度来适应不同的幕,从而使应用程序在多幕上保持幕分辨率一致。UI缩放是指Qt可以通过缩放UI控件来适应不同的幕分辨率,这样就可以缩放应用程序的整个UI界面。 无论是DPI缩放还是UI缩放,都需要对应用程序进行一些调整,并且需要考虑到每个幕的分辨率和大小。Qt提供了一些函数和类来优化多环境下的应用程序,如QScreen和QWindow等。 综上所述,Qt提供了多种方法来适应多幕环境,其中包括DPI缩放和UI缩放。开发人员应该根据具体情况选择合适的缩放方法,并且对应用程序进行必要的调整,以确保在多幕环境下有更好的用户体验。 ### 回答2: 在使用Qt开发时,我们可能需要考虑到不同的幕分辨率和缩放比例对UI界面的影响,以保证程序在不同设备上具有良好的用户体验。 首先,Qt提供了一些关于幕分辨率和缩放比例的接口函数,比如QScreen::availableSize()和QScreen::logicalDotsPerInch()。这些函数可以帮助我们获取当前幕的大小和密度信息。同时,Qt还提供了一些函数来响应幕缩放比例的变化,比如QWindow::devicePixelRatioChanged()和QWidget::resizeEvent()。 其次,为了适应不同的分辨率和缩放比例,我们需要采取一些措施来调整UI界面的布局和大小。例如,我们可以使用Qt的布局管理器来自动计算和调整界面控件的大小和位置,以适应不同的幕分辨率。另外,我们还可以考虑使用矢量图形代替位图图像,以保证图像在不同分辨率下的清晰度。 最后,我们需要进行充分的测试和调试,以确保程序在不同幕分辨率和缩放比例下的表现都符合预期。这个过程既可以手动进行,也可以借助一些自动化测试工具来完成。 综上所述,Qt开发需要考虑到不同的幕分辨率和缩放比例,采取相应的措施来调整UI界面的布局和大小,并进行充分的测试和调试。 ### 回答3: Qt 是一个跨平台的 C++ 应用程序开发框架,旨在为开发者提供高效且易于使用的工具来创建现代 UI 界面和应用程序。在 Qt 中,多幕缩放比例都是需要注意的重要问题。 Qt 通过 QScreen 类提供了多支持。通过检索当前系统中的所有幕,并使用 QDesktopWidget 类的基本辅助函数计算其大小和位置,您可以获取要素,如应用程序是否覆盖多个幕等。在QScreen中,可以通过geometry()和availableGeometry() 函数获取幕的宽高和可用宽高。 对于幕缩放比例,Qt 允许您在不同的设备上为不同的密度设置缩放比例。DPI (Dots Per Inch) 是测量显示器分辨率的单位,通常用于确定幕上图像和文本的大小。在 Qt 中,可以使用QScreen::devicePixelRatio()获取幕的缩放比例。如果您想将您的应用程序设计为在不同分辨率和设备上都能正常显示,您需要根据幕的实际 DPI 设置计算缩放比例。在 Qt 中,可以使用QApplication::primaryScreen()->logicalDotsPerInch()获取当前幕的 DPI 值,然后根据需要采用不同的缩放比例来设置应用程序。 在 Qt 中,多幕缩放比例都需要仔细考虑,以确保您的应用程序在不同的设备和分辨率上都能正常显示,并为最终用户提供出色的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值