获取原始密钥,就像没有移位修改器一样

时间:2017-03-06 17:53:38

标签: c++ qt

我想创建键盘绑定,它至少在不同的键盘布局上起作用。我的问题是shift修饰符会将键转换为不同的键,详见文档:http://doc.qt.io/qt-5/qkeysequence.html#keyboard-layout-issues

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

另见这个(目前尚未回答)问题:get shift+numerical keys in qt using qkeyevent

1 个答案:

答案 0 :(得分:0)

在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();
  }
}

示例的完整源代码可以在here中找到。