获取原始键,就像没有移位修饰符一样

GPM*_*ler 5 c++ qt

我想创建键盘绑定,至少在不同的键盘布局上工作类似。我的问题是shift修饰符将键转换为不同的键,如文档中所述:http : //doc.qt.io/qt-5/qkeysequence.html#keyboard-layout-issues

无论键盘布局如何,有没有办法找出原始键? 例如,.shift+.被按下时找出被按下。

另请参阅此(当前未回答)问题:使用 qkeyevent 在 qt 中获取 shift+numeric keys

cbu*_*art 3

在 Windows 中,您可以使用MapVirtualKeyAMAPVK_VK_TO_CHAR来获取未移位的密钥。MapVirtualKeyA需要虚拟钥匙,可以使用QKeyEvent::nativeVirtualKey

注意:当仅按修饰符时QKeyEvent::key()可能会报告错误字符,虚拟键有助于区分这些情况。

例子

void MainWindow::keyPressEvent(QKeyEvent* ke)
{
  const auto vk = ke->nativeVirtualKey();
  const auto unshifted_key = MapVirtualKeyA(vk, MAPVK_VK_TO_CHAR);

  qDebug() << "Original key:" << (char)ke->key();
  qDebug() << "Unshifted key:" << (char)unshifted_key;

  if (unshifted_key > 0) { 
    // Printing the full key sequence just for comparison purposes
    QString modifier;
    if (ke->modifiers() & Qt::ShiftModifier) modifier += "Shift+";
    if (ke->modifiers() & Qt::ControlModifier) modifier += "Ctrl+";
    if (ke->modifiers() & Qt::AltModifier) modifier += "Alt+";
    if (ke->modifiers() & Qt::MetaModifier) modifier += "Meta+";
    const QKeySequence ks(modifier + QChar(ke->key()));
    qDebug() << "Full key sequence:" << ks.toString();
  }
}
Run Code Online (Sandbox Code Playgroud)

该示例的完整源代码可以在此处找到。