捕捉Qt中的修改键

8

我正在尝试理解如何使用Qt处理各种事件,并发现了一个我无法理解的问题,即关于键盘修饰符,例如Ctrl Shift Alt等。我在Qt Creator中创建了一个默认的Qt GUI应用程序,扩展了QMainWindow,并发现以下示例没有产生可理解的结果。

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    qDebug() << "Modifier " << event->modifiers().testFlag(Qt::ControlModifier);
    qDebug() << "Key " << event->key();
    qDebug() << "Brute force " << (event->key() == Qt::Key_Control);
}

使用事件中的modifiers()函数永远不会返回正确值,而暴力方法可以返回正确值。我做错了什么?
2个回答

27

尝试使用以下代码检查Shift键:

if(event->modifiers() & Qt::ShiftModifier){...}

检查控制键:

if(event->modifiers() & Qt::ControlModifier){...}

等等。这对我很有效。

编辑:

要获取滚轮事件的修饰符,需要检查传递给wheelEvent()方法的QWheelEvent对象:

void MainWindow::wheelEvent( QWheelEvent *wheelEvent )
{
    if( wheelEvent->modifiers() & Qt::ShiftModifier )
    {
        // do something awesome
    }
    else if( wheelEvent->modifiers() & Qt::ControlModifier )
    {
        // do something even awesomer!
    }
}

1
看起来情况变得更加复杂了。修饰符只有在按下另一个键时才起作用,例如如果我按下<kbd>Ctrl</kbd>键,则您建议的if语句将不成立。如果我按下<kbd>Ctrl</kbd>+<kbd>Any</kbd>,则shift修饰符起作用。这些测试是在OSX 10.8.4上执行的,可能会影响到这个问题... - user29291
进一步测试表明,使用if(event->modifiers() & Qt::ControlModifier)和其他修饰键只在keyPressEvent中起作用,并且仅在与修饰键同时按下另一个键时才能正常工作。最终目标是使其在滚轮事件的eventFilter中起作用,但这对于那个并不起作用。 - user29291
它似乎在其中一台测试电脑上可以运行,我需要在另一台测试电脑上尝试一下,因为我记得我已经尝试过更新的答案了。 - user29291
在另一台电脑上测试了代码并发现了一些有趣的事情。设置是Macbook Pro连接到外部显示器和键盘/鼠标。修饰符仅在使用触摸板滚动时才起作用,而在使用外部鼠标滚轮时则不起作用。 - user29291
@user29291 真的很有趣。我从未考虑过Qt如何处理多个鼠标/键盘。这绝对是需要记在心中的事情! - Freedom_Ben

8
根据文档,QKeyEvent::modifiers不总是可靠的。请尝试使用QApplication::keyboardModifiers()静态函数代替。
来自Qt 5 Doc. - Qt::KeyboardModifiers QKeyEvent::modifiers() const警告:这个函数并不总是可靠的。例如,用户同时按下并释放两个Shift键时可能会混淆它。

我使用Macbook Pro配合外接鼠标和键盘,发现修饰键只在使用笔记本电脑的触控板时有效,而在外接鼠标的滚轮上无效。 - user29291
能否添加一个链接或更多信息,以说明哪些文档表明“QKeyEvent :: modifiers”不能始终被信任? - ssc
无法信任QKeyEvent :: modifiers - http://qt-project.org/doc/qt-5/qkeyevent.html#modifiers - David Burson
有趣的是,当我按下Shift键时,以下是我得到的信息:Key press: 0x1000020,QApplication::keyboardModifiers() = 0x0,event->modifiers = 0x2000000当我同时按下两个Shift键时,以下是我得到的信息:Key press: 0x1000020,QApplication::keyboardModifiers() = 0x2000000,event->modifiers = 0x0无论我按下多少个Shift键,这里是Shift + 1时我得到的信息:Key press: 0x21,QApplication::keyboardModifiers() = 0x2000000,event->modifiers = 0x2000000(Ubuntu 20.04 LTS,Qt 5.15) - darda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接