2

我有一个带有 6 个按钮的 USB 设备,我正在尝试与我的应用程序一起使用。该设备的文档列出了每个按钮的键映射。例如,这些按钮之一据说映射到 Ctrl+Shift+F20。

对此进行编码虽然不起作用:

我继承的代码是:

void devControl::processKeyRelease(QKeyEvent *ke)
{
    int key = ke->key();

    if (ke->modifiers() & Qt::ShiftModifier &&
        ke->modifiers() & Qt::ControlModifier)
    {
         if ( key = Qt::Key_F20 )
         {
             // Do somethings
         }
    }
.
.
}

我使用 USBLyzer ( http://www.usblyzer.com/ ) 和 Linux 上的 evtest ( https://www.systutorials.com/docs/linux/man/1-evtest/ ) 来检查正在发送的数据/密钥和为该按钮找到以下内容:

在此处输入图像描述

原始值为01 03 00 6F 00 00 00 00 00

查看所有按钮数据,它们在重复修饰符时都表现出相同的行为。

我的想法是试试这个:

    if (ke->modifiers() & Qt::ShiftModifier &&
        ke->modifiers() & Qt::ControlModifier &&
        ke->modifiers() & Qt::ShiftModifier &&
        ke->modifiers() & Qt::ControlModifier)

但这是正确的吗?我等着早上回去工作时试试这个,但如果以前见过这个的人给我建议的话,我会很感激。

编辑 1

以上并没有什么不同。我添加了更多调试,如下所示:

if (e->type() == QEvent::KeyPress) {
    QKeyEvent *eKey = static_cast<QKeyEvent *>(e);
    qDebug() << "Key PRESS event " << eKey->modifiers() << Qt::Key(eKey->key());

}

结果是:

Key PRESS event  QFlags<Qt::KeyboardModifiers>(ControlModifier) Qt::Key(Key_Control)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ControlModifier) Qt::Key(Key_Control)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ControlModifier) Qt::Key(Key_Control)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ControlModifier) Qt::Key(Key_Control)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ControlModifier) Qt::Key(Key_Control)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ShiftModifier|ControlModifier) Qt::Key(Key_Shift)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ShiftModifier|ControlModifier) Qt::Key(Key_Shift)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ShiftModifier|ControlModifier) Qt::Key(Key_Shift)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ShiftModifier|ControlModifier) Qt::Key(Key_Shift)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ShiftModifier|ControlModifier) Qt::Key(Key_Shift)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ShiftModifier|ControlModifier) Qt::Key(Key_F20)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ShiftModifier|ControlModifier) Qt::Key(Key_F20)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ShiftModifier|ControlModifier) Qt::Key(Key_F20)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ShiftModifier|ControlModifier) Qt::Key(Key_F20)
Key PRESS event  QFlags<Qt::KeyboardModifiers>(ShiftModifier|ControlModifier) Qt::Key(Key_F20)

我需要一种方法来确定整个事件或组合键何时开始和结束。然后我可以累积整个事件的按下次数并决定按下了哪个按钮。

编辑 2

决定通过添加布尔值来记录何时检测到键 Control、Shift 或 Alt 来处理此问题,并且当检测到非修饰符时假设我们拥有所有键(此设备为 true)然后执行适当的逻辑。

这现在有效。

bool _controlPressed; bool _shiftPressed; 布尔 _altPressed; bool _action_Completed;

当检测到新按钮按下时,这些设置为 false。

然后每次调用 OnKeyRelease:

if (key == Qt::Key_Control ){
    _action_Completed = false; // We expect one or more key
    _controlPressed = true;
    return;
}  
if (key == Qt::Key_Shift ) {
    _action_Completed = false;  // We expect one or more key
    _shiftPressed = true;
    return;
}
if (key == Qt::Key_Alt ){
    _action_Completed = false; // We expect one or more key
    _altPressed = true;
    return;
}
if ( _controlPressed && _shiftPressed && _altPressed  && ! _action_Completed )
{
    if (! mappedKey( key)) {
        return;
    }

    doCtrlShiftAlt( key);
    return;
}
if ( _controlPressed && _shiftPressed  && ! _action_Completed )
{
    if (! mappedKey( key)) {
        return;
    }

    doCtrlShift( key);
    return;
}
if (  _shiftPressed   && ! _action_Completed )
{
    if (! mappedKey( key)) {
        return;
    }

    doShift( key);
    return;
}

if (! mappedKey( key)) {
    return;
}

if (  ! _action_Completed )
{
    doNoMod( key);
}
4

0 回答 0