1

我正在使用 QT4,并创建了一个 QGLWidget,我想在其中实现右键单击上下文菜单。我希望上下文菜单仅在单击鼠标右键并按下 CTRL 键时出现。

我尝试通过在按下 CTRL 键时设置一个控制标志来实现这一点,然后在释放 CTRL 键时清除它(通过 a keyReleaseEvent)。问题是当上下文菜单启动时我没有收到a keyReleaseEvent(不仅仅是CTRL,根本没有按键释放)。

例如:我按住CTRL,单击鼠标右键,然后出现上下文菜单(仍然按住CTRL)。在没有选择菜单中的任何内容的情况下,我释放了 CTRL 键,但我的程序没有收到keyPressEvent. 因此我的标志永远不会被清除,并且下次用户右键单击(即使没有控制)时,上下文菜单也会出现。

keyPressEvent当上下文菜单存在时,为什么我没有收到?

我正在使用 QT 4.8 (C++) 并在 Windows 和 Linux 上进行了测试,结果相同。

4

2 回答 2

3

我认为处理这种情况的最佳方法是检查打开上下文菜单时是否按住了 CTRL。这样您就可以避免这些问题,并且不必跟踪该标志。试试这个:

void DerivedClass::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::RightButton && event->modifiers().testFlag(Qt::ControlModifier))
    {
        // Open the context menu.
    }
    else
    {
        BaseClass::mousePressEvent(event);
    }
}

编辑:那是 Qt::ControlModifier,而不是 Qt::CtrlModifier。

于 2012-04-19T23:25:42.193 回答
1

对于为什么部分,Qt 将键事件发送到具有键盘焦点或显式抓取键盘(使用QWidget::grabKeyBoard())的小部件,因为上下文菜单是您释放键时的小部件,它会接收键释放事件。

于 2012-04-19T23:49:08.700 回答