Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何使用QKeyEvent正确检测元密钥?_Qt - Fatal编程技术网

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

Qt 如何使用QKeyEvent正确检测元密钥?,qt,Qt,我正在尝试用Qt实现一个快捷方式处理程序,以允许用户编辑它们。我希望它是交互式的,所以我在当前输入时显示快捷方式,而不仅仅是在完成时。我想我离解决方案还不远,但是我仍然有一些关于元密钥(Windows上的Windows密钥)的问题 它似乎是由下面的第一个if语句检测到的,但不是由最后一个使用modifiers函数的if语句检测到的 void ShortcutInputWidget::handleKeyEvent(QKeyEvent *event) { int keyDisplayed =

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

它似乎是由下面的第一个if语句检测到的,但不是由最后一个使用modifiers函数的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();
}
void ShortcutInputWidget::handleKeyEvent(QKeyEvent*事件)
{
int KEYDISPLAED=事件->键();
Qt::Key keys=静态_转换(显示键);
//如果按下的键只是一个修改器,我们将重置该键
if(keys==Qt::Key\u控件||
keys==Qt::Key\u Shift||
keys==Qt::Key\u Alt||
keys==Qt::Key\u Meta)
{ 

qDebug()我在Linux[Qt creator]上运行了相同的示例。它运行得很好,两条消息都显示了。在您的情况下,可能是操作系统相关的问题。我按下的键是windows键,它检测到该键是元键

Single press of special key: Ctrl, Shift, Alt or Meta 
meta:  QKeySequence("Meta+") 
"" 
meta detected 
QKeySequence("Meta+")  

在Windows上,Windows键似乎不是一个修饰符

 Qt::KeyboardModifiers modifiers = event->modifiers();
当按下windows键时,您将获得一个空标志,但您处理的其他键将获得一个非空标志……我认为这是有意义的,因为根据我的经验,windows上的windows键从来没有被用户应用程序使用过

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


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

是的,也许你是对的,我认为是一个bug的东西实际上可能不是。我会小心地在Mac上进行测试。应该注意的是,实际上存在相当多的问题很少有快捷键是WindowsKey+()谢谢Chris…你知道这些快捷键是“锁定”的还是一般可以处理的吗?