c++ - 像没有 shift 修改器一样获取原始 key

标签 c++ qt

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

有没有办法在不考虑键盘布局的情况下找出原始键? 例如。发现 . 在按下 shift+. 的同时被按下。

另请参阅此(目前未答复)问题:get shift+numerical keys in qt using qkeyevent

最佳答案

在 Windows 中,您可以使用 MapVirtualKeyAMAPVK_VK_TO_CHAR 获取未移位的 key 。 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 中找到.

关于c++ - 像没有 shift 修改器一样获取原始 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42632373/

相关文章:

c++ - Matlab 到 C++ 的翻译

c++ - 有效地检查整数的偶数/奇数

c++ - 如何正确关闭 QWebView 而不会导致内存泄漏?

c++ - Qt/C++ 对扩展 QWidget 的调用函数

c++ - Qt和opencv中的人脸检测

c++ - 在 Qt 中计算数学表达式

C++ 包含混淆

c++ - 传递参数时的宏扩展问题

c++ - 使用 createWindowEx 构建成功,窗口仍然不会出现

python - 使用 QXmlStreamReader 的 XML 解析不返回所有元素