【问题标题】:Get original key as though without shift modifier获取原始键,好像没有 shift 修饰符
【发布时间】:2017-03-06 17:53:38
【问题描述】:

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

是否有任何方法可以在不考虑键盘布局的情况下找出原始键? 例如。发现按下shift+.时按下了.

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

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    在 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 中找到。

    【讨论】:

      猜你喜欢
      • 2011-03-21
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2019-03-31
      • 2011-07-30
      • 2017-02-12
      相关资源
      最近更新 更多