【问题标题】:Detecting the right shift key in Qt在 Qt 中检测右移键
【发布时间】:2017-06-28 22:39:05
【问题描述】:

是否可以仅在 Qt 中捕获右移键?

list of values for the Qt::Key enum 里面有Key_Shift(也有Key_Kana_ShiftKey_Eisu_Shift 不过好像是日文键盘的)但是我不知道怎么区分左右shift键,是这个甚至可能?

我想找到一个适用于主要平台(GNU/Linux、Windows、MacOS)的解决方案

感谢您的帮助和亲切的问候, 托德

【问题讨论】:

标签: qt keyboard qt5 shift


【解决方案1】:

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 来获取代码。

【讨论】:

【解决方案2】:

如果您在 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
}

【讨论】:

  • 感谢您的帮助。很抱歉,但我没有说明我正在使用 GNU/Linux 并且需要跨平台解决方案(我正在更新问题以明确这一点)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多