从1.7版开始的Xorg服务器支持在一台PC上使用多个鼠标光标。
我也知道QT提供了处理鼠标事件并对其进行操作的功能。
Question:
我想在双鼠标设备配置中处理QT应用程序中的特定鼠标事件。
假设我已经创建了2个鼠标指针,并有2个物理鼠标设备连接到PC。第一个鼠标设备用于常规使用,第二个应该在某些QWidget中无限移动。
是否有可能在QT应用程序中识别相应的鼠标设备(在多个鼠标光标的情况下)并使其仅在指定的小部件中移动,同时第二只鼠标应该能够作为常规鼠标设备使用?
NOTES:
QT应用程序将在Linux上运行,所以我对Windows不感兴趣。
我可以自由修改Linux内核驱动程序等…
这并没有回答OP的问题,因为这是一种更通用的方法,而不是针对qt的。
如果辅助鼠标(或任何您想使用的HID设备)通常根本不打算成为指针,您可以使用Linux输入子系统来"抓取"。并直接连接到输入设备。这样做的缺点是它不再是指针,你需要自己处理它的移动并生成它产生的事件;但是,包括Qt在内的所有工具包都支持。
HID事件输入设备可以作为/dev/input/event*
访问,相应的伪文件/sys/class/input/event*/device/name
给出其人类可读的名称(例如,PS/2 Generic Mouse),/sys/class/input/event*/device/id/vendor
和/sys/class/input/event*/device/id/product
其USB供应商:product(十六进制)。大多数Linux发行版在/dev/input/by-id/
和/dev/input/by-path/
中生成符号链接,但是您最有可能希望设置一个udev规则(在/etc/udev/rules.d/
或/lib/udev/rules.d/
中,取决于您是作为用户还是管理员,还是作为安装应用程序的一部分),该规则生成合适的符号链接并授予目标用户对设备的访问权限。
本质上,一个访问事件设备的进程,打开它(读写),并运行ioctl(devfd, EVIOCGRAB, 1)
到"抓取";设备,以便只有本进程看到本设备生成的事件(并且它们不再转发给其他进程);特别是,鼠标将不再影响主指针的移动)。然后,进程只从设备中读取struct input_event
结构,如<linux/input.h>
所述。(更多细节请点击这里。)该设备只返回完整的结构,如果缓冲区足够大,每次读取可以返回多个结构,所以它是一个非常简单的接口。
所有这些(设备和伪文件)都是Linux内核-用户空间的直接接口,并且被Linux内核开发人员认为是稳定的。这意味着在应用程序中依赖它们是安全的。
在实践中,您可能希望在单独的线程或单独的进程中访问设备。独立的进程允许你进行特权分离,以防你想限制其他应用程序对设备的直接访问(当你的应用程序没有运行时);请注意,即使这样,您可能希望在Qt应用程序中使用一个单独的线程来接收来自该进程的事件,并生成由主线程处理的小部件事件。就我个人而言,我会使用一个由应用程序启动的单独进程,用Unix域流套接字(而不是普通的管道,因为套接字是双向的)或两个连接两者:一个套接字以您认为合适的任何格式提供鼠标事件(以本机二进制格式,因为它们在同一台机器上运行),另一个套接字用于控制信息,例如描述哪些设备可用,何时添加或删除设备,以及应用程序选择实际使用的设备。(我会用前者替换标准输入,用后者替换标准输出——反之亦然——在单独的过程中。这一点也不复杂。)
一个单独的进程也允许你分离翻译逻辑,如果你有一天决定支持非hid设备,比如一个自定义的3D USB控制器,它有自己的用户空间"驱动程序";应用程序。只要确保您决定在应用程序和helper进程之间使用的任何格式都能满足您的需求(而不是设备功能)。
请注意,上述内容并不局限于鼠标或操纵杆,键盘也同样适用。事件结构相同,只是内容不同。