【发布时间】:2017-06-28 22:39:05
【问题描述】:
是否可以仅在 Qt 中捕获右移键?
list of values for the Qt::Key enum 里面有Key_Shift(也有Key_Kana_Shift 和Key_Eisu_Shift 不过好像是日文键盘的)但是我不知道怎么区分左右shift键,是这个甚至可能?
我想找到一个适用于主要平台(GNU/Linux、Windows、MacOS)的解决方案
感谢您的帮助和亲切的问候, 托德
【问题讨论】:
是否可以仅在 Qt 中捕获右移键?
list of values for the Qt::Key enum 里面有Key_Shift(也有Key_Kana_Shift 和Key_Eisu_Shift 不过好像是日文键盘的)但是我不知道怎么区分左右shift键,是这个甚至可能?
我想找到一个适用于主要平台(GNU/Linux、Windows、MacOS)的解决方案
感谢您的帮助和亲切的问候, 托德
【问题讨论】:
Qt 没有为这些键提供可移植的名称。但是,它确实使您可以访问密钥的特定于平台的扫描码。这是通过QKeyEvent::nativeScanCode() 完成的。在您的QWidget::keyPressEvent() 函数中,添加一些临时代码以打印您按下的按键的扫描代码:
#include <QDebug>
#include <QKeyEvent>
void YourWidgetClass::keyPressEvent(QKeyEvent *event)
{
qDebug() << event->nativeScanCode();
event->accept();
}
现在运行您的程序并按 shift 键。在我的系统(Linux/X11)上,左移代码为 50,右移代码为 62。这意味着您可以检查这些:
void YourWidgetClass::keyPressEvent(QKeyEvent *event)
{
switch (event.nativeScanCode()) {
case 50: // left shift
case 62: // right shift
}
}
这些代码在使用 XCB 在 X11 中运行的所有 Linux 系统上都是相同的。它们在其他 Linux 系统上可能不同(例如运行 Wayland 而不是 X11 的系统。)它们在 Windows 上也不同,尽管所有 Windows 版本都使用(AFAIK)相同的代码。您可以谷歌搜索 Windows 上的扫描码。请注意,扫描代码通常以十六进制记录,因此当您看到“30”时,您应该在代码中使用“0x30”。
但您不能在 Mac OS 上执行此操作。在 Mac OS 上,您需要使用非 Qt API 来获取代码。
【讨论】:
nativeVirtualKey 而不是 nativeScanCode 并与 HIToolBox 值相关联,即重复的 in this StackOverflow answer。
nativeVirtualKey() == 0。
如果您在 Windows 操作系统上进行编码,则可以使用 nativeVirtualKey() const 类型。 Windows 为按下的各个键提供标识符,包括左移键和右移键(分别为 VK_LSHIFT 和 VK_RSHIFT)https://msdn.microsoft.com/en-us/library/ms927178.aspx。通过类似于以下方式访问按键事件的虚拟键:
if (event->nativeVirtualKey() == VK_LSHIFT) {
// left shift specific code
} else if (event->nativeVirtualKey() == VK_RSHIFT) {
// right shift specific code
}
【讨论】: