首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用QKeyEvent正确检测元密钥?

如何使用QKeyEvent正确检测元密钥?
EN

Stack Overflow用户
提问于 2012-05-14 19:32:50
回答 2查看 4.5K关注 0票数 2

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

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

代码语言:javascript
复制
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+"),而不是meta detected。但是如果我点击"ctrl + meta“,两个语句都会检测到元键。

我做错了什么吗?

编辑:我忘了说我使用的是Windows7,而且我有一个EN-GB的键盘

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-14 21:35:16

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

代码语言:javascript
复制
 Qt::KeyboardModifiers modifiers = event->modifiers();

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

现在,Mac键在Mac OSes上默认是一个修饰符,当在Mac计算机上运行windows时,windows键被分配给这个键。这变得非常棘手,因为它在运行OS X时可能是有效的修饰符,而在运行Windows时无效。

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

票数 2
EN

Stack Overflow用户

发布于 2012-05-14 21:24:44

我在LinuxQt creator上运行了相同的示例。它工作得很好,两条消息都显示出来了。在您的情况下,可能是一些与操作系统相关的问题。我按下的键是windows键,它检测到它是元键。

代码语言:javascript
复制
Single press of special key: Ctrl, Shift, Alt or Meta 
meta:  QKeySequence("Meta+") 
"" 
meta detected 
QKeySequence("Meta+")  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10582498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档