2

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

它似乎被下面的第一个 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+")but no meta detected。但是,如果我点击“ctrl + meta”,两个语句都会检测到元键。

难道我做错了什么?

编辑:我忘了提到我使用的是 Windows 7 并且我有一个 EN-GB 键盘

4

2 回答 2

2

似乎在 Windows 上 Windows 键不是修饰符。当您调试或打印通过以下方式获得的值时

 Qt::KeyboardModifiers modifiers = event->modifiers();

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

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

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

于 2012-05-14T13:35:15.723 回答
0

好吧,我在 Linux [Qt creator] 上运行相同的示例。它工作得很好,两条消息都显示了。在您的情况下,可能是一些与操作系统相关的问题。我按下的键是 Windows 键,它检测为元键。

Single press of special key: Ctrl, Shift, Alt or Meta 
meta:  QKeySequence("Meta+") 
"" 
meta detected 
QKeySequence("Meta+")  
于 2012-05-14T13:24:44.473 回答