我正在使用QT4,并且我创建了一个QGLWidget,我想在其中实现一个右键单击上下文菜单。我希望仅当单击鼠标右键并按下CTRL键时才显示上下文菜单。
我尝试通过在按下Ctrl键时设置一个控制标志,然后在释放Ctrl键时清除它(通过keyReleaseEvent)来实现这一点。问题是,当上下文菜单打开时,我没有收到keyReleaseEvent (不仅仅是CTRL,根本没有按键释放)。
例如:我按住CTRL键,单击鼠标右键,然后出现上下文菜单(仍然按住CTRL键)。在没有选择菜单中的任何内容的情况下,我松开了CTRL键,但我的程序没有接收到keyPressEvent。因此,我的标志永远不会被清除,下一次用户右击时(即使没有按住控件),上下文菜单也会出现。
当出现上下文菜单时,为什么我没有收到keyPressEvent?
我使用的是Qt4.8 (C++),并在Windows和Linux上进行了测试,结果是一样的。
发布于 2012-04-20 07:49:09
对于为什么,Qt将按键事件发送到具有键盘焦点或显式抓住键盘的小部件(使用QWidget::grabKeyBoard()),因为上下文菜单是您释放按键时的小部件,它接收按键释放事件。
发布于 2012-04-20 07:25:42
我认为处理这种情况的最好方法是在打开上下文菜单时检查是否按下了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。
https://stackoverflow.com/questions/10237482
复制相似问题