qt - 如何使用 QKeyEvent 正确检测元键?

标签 qt

我正在尝试使用 Qt 实现快捷方式处理程序以允许用户编辑它们。我希望它是交互式的,因此我在当前输入时显示快捷方式,而不仅仅是在完成时显示。我认为我离解决方案并不遥远,但我仍然对元键(Windows 上的 Windows 键)有一些问题。

它似乎可以被下面的第一个 if 语句检测到,但不能被最后的 if 语句检测到,使用修饰符函数。

void ShortcutInputWidget::handleKeyEvent(QKeyEvent *event)
{
    int keyDisplayed = event->key();
    Qt::Key keys = static_cast<Qt::Key>(keyDisplayed);

    // if the key pressed is only a modifier, we reset the key
    if(keys == Qt::Key_Control ||
        keys == Qt::Key_Shift ||
        keys == Qt::Key_Alt ||
        keys == Qt::Key_Meta)
    { 
        qDebug() << "Single press of special key: Ctrl, Shift, Alt or Meta";
        if (keys == Qt::Key_Meta)
            qDebug() << "meta: " << QKeySequence(Qt::META);
        keyDisplayed = 0;
    }

    // handle modifiers
    Qt::KeyboardModifiers modifiers = event->modifiers();
    QString text = event->text();
    qDebug() << text;
    if (modifiers & Qt::ShiftModifier){
        keyDisplayed |= Qt::SHIFT;
        qDebug() << "shift modifier detected";
    }
    if (modifiers & Qt::ControlModifier){
        keyDisplayed |= Qt::CTRL;
        qDebug() << "control modifier detected";
    }
    if (modifiers & Qt::MetaModifier){
        keyDisplayed |= Qt::META;
        qDebug() << "meta detected";
    }
    if (modifiers & Qt::AltModifier){
        keyDisplayed |= Qt::ALT;
        qDebug() << "alt modifier detected";
    }

    qDebug() << QKeySequence(keyDisplayed);
    setText(QKeySequence(keyDisplayed));
    event->accept();
}

如果我只按元键,输出是meta: QKeySequence("Meta+"),但没有检测到元。但是如果我点击“ctrl + meta”,这两个语句都会检测到元键。

我做错了什么吗?

编辑:我忘了提及我正在使用 Windows 7 并且我有 EN-GB 键盘

最佳答案

在 Windows 上,Windows 键似乎不是修饰符。当你调试或打印

得到的值
 Qt::KeyboardModifiers modifiers = event->modifiers();

按下 Windows 键时,您会获得一个空标志,但您处理的其他键会获得一个非空标志...我认为这是有道理的,因为根据我的经验,在 Windows 上 Windows 键用户应用程序从未使用过。

现在,Mac 键在 Mac 操作系统上默认是修饰键,在 Mac 计算机上运行 Windows 时,Windows 键会分配给此键。这变得非常棘手,因为它在运行 OS X 时可能是有效的修饰符,但在运行 Windows 时无效。

我能给的唯一建议是再考虑一下你想要实现的目标,然后分别在 Mac、Windows 和 Linux 上进行测试。有时需要确保可移植性。

关于qt - 如何使用 QKeyEvent 正确检测元键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10582498/

相关文章:

c++ - 我的 Qt5 程序如何从控制台获取参数?

c++ - 构建 Qt 程序时遇到问题

qt - 您可以隐藏 QGroupBox 框架但保留其内容可见吗?

c++ - 使用 qmultimedia 低级 API 的 Qt 中的音频输出问题

python - 以全尺寸显示标签中的图像

css - HLine/VLine 颜色的 QT 样式表

c++ - Qt中的logicalDpiX和physicalDpiX有什么区别?

c++ - 我正在尝试获取媒体播放器的元数据,但在 QT 中不断出现 C2228 错误

python - mac osx雪豹中的pyqt安装问题

c++ - 如何在 QTreeView 中获取所选项目