我有一个带有 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);
}