检测Qt中的右移键
Detecting the right shift key in Qt
是否只能在Qt中捕获右shift键?
在list of values for the Qt::Key enum里面有Key_Shift
(还有Key_Kana_Shift
和Key_Eisu_Shift
但是好像是日文键盘)但是我不知道怎么区分左右shift键,这样可以吗?
我想找到适用于主要平台(GNU/Linux、Windows、MacOS)的解决方案
感谢您的帮助和亲切的问候,
托德
如果您在 Windows OS 上编码,那么您可以使用 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
}
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
}
}
这些代码在所有 Linux 系统上都是相同的 运行ning 在 X11 中使用 XCB。它们在其他 Linux 系统上可能不同(比如那些 运行ning Wayland 而不是 X11。)它们在 Windows 上也不同,尽管所有 Windows 版本都使用(AFAIK ) 相同的代码。您可以 Google 了解扫描代码在 Windows 上的内容。请注意,扫描代码通常以十六进制记录,因此当您看到“30”时,您应该在代码中使用“0x30”。
但是您不能在 Mac OS 上执行此操作。在 Mac OS 上,您需要使用非 Qt API 来获取代码。
是否只能在Qt中捕获右shift键?
在list of values for the Qt::Key enum里面有Key_Shift
(还有Key_Kana_Shift
和Key_Eisu_Shift
但是好像是日文键盘)但是我不知道怎么区分左右shift键,这样可以吗?
我想找到适用于主要平台(GNU/Linux、Windows、MacOS)的解决方案
感谢您的帮助和亲切的问候, 托德
如果您在 Windows OS 上编码,那么您可以使用 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
}
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
}
}
这些代码在所有 Linux 系统上都是相同的 运行ning 在 X11 中使用 XCB。它们在其他 Linux 系统上可能不同(比如那些 运行ning Wayland 而不是 X11。)它们在 Windows 上也不同,尽管所有 Windows 版本都使用(AFAIK ) 相同的代码。您可以 Google 了解扫描代码在 Windows 上的内容。请注意,扫描代码通常以十六进制记录,因此当您看到“30”时,您应该在代码中使用“0x30”。
但是您不能在 Mac OS 上执行此操作。在 Mac OS 上,您需要使用非 Qt API 来获取代码。