背景:我目前正在创建一个嵌入QWidget中的简单VNC查看器,以便在Windows上使用。为此,我编译了KRDC(KDE的远程桌面查看器)的仅Qt的VNC版本,以及它在windows上的依赖关系libvncclient。然而,现在出现的问题在于krdc通过vnc发送密钥事件的方式:它只是发送QKeyEvent::nativeVirtualKey()的值,在X11上,它已经是一个有效的RFB密钥ym了。然而,在Windows上,情况并非如此。
现在,为了解决这个问题,我认为最好的(最终也是可移植的)方法是将Qt的QKeyEvent::key()和::modifier()数据转换回有效的X11/RFB keysyms。不过,考虑到我需要根据修饰符状态(XK_a与XK_a,到目前为止我只考虑了shift)来选择不同的keysym,这似乎有点复杂。在Qt的源代码中研究X11->Qt的翻译也没有真正的帮助。
可能已经有一个库或代码片段可以实现这一点了吗?还是我应该试着写自己的(不完整的)翻译程序?如果是这样的话,最好的方法是什么?还有,我应该注意与X11相关的其他注意事项吗?
嗯,看起来我实际上是盲人;krdc的代码中有一个引用,就在e->nativeVirtualKey()语句的下面,引用了另一个项目的类,在那里他们遇到了和我完全相同的问题:
// hmm, either Win32-platform or too old Qt so we have to handle and
// translate Qt-key-codes to X-keycodes
我没有测试他们的解决方案,但它看起来很可靠。由于我现在才发现这一点,我自己已经写了一个小程序,它应该适用于大多数拉丁键盘(但如果Qt团队更改任何Qt::键值,它可能会中断),如果有人对此感兴趣的话:链接