Qt QMenu正在主窗口外显示

Qt QMenu正在主窗口外显示,qt,qt4,qmenu,Qt,Qt4,Qmenu,我正在使用一个自定义的QGraphicsWidget,当我右键单击它时,我想打开一个菜单。我是这样开始的: void myQGraphicsWidget::mousePressEvent(QGraphicsSceneMouseEvent *event){ if(event->button() & Qt::RightButton){ const QString test = "test"; QMenu menu; menu.s

我正在使用一个自定义的QGraphicsWidget,当我右键单击它时,我想打开一个菜单。我是这样开始的:

void myQGraphicsWidget::mousePressEvent(QGraphicsSceneMouseEvent *event){
    if(event->button() & Qt::RightButton){
        const QString test = "test";
        QMenu  menu;
        menu.setTitle(test);
        menu.addAction(test);
        menu.exec(mapToScene(event->pos()).toPoint());
        //menu.exec(mapToScene(QPointF(0,0)).toPoint());
    }
}

但是菜单显示在主应用程序窗口的外面,朝向我的另一个显示器的右下角。当我使用注释掉的版本时,它显示在我的主窗口顶部。我曾尝试手动调整该点,使其在窗口内按摩,但它只会跳到靠在窗口顶部或从底部悬挂,而不会在窗口内。

QMenu::exec
占据全局位置;您将获取小部件的相对位置并将其映射到场景位置

请尝试以下方法:

    menu.exec(event->screenPos());

什么类型的事件具有globalPos()成员函数?我能够让我的QMenu最终显示在主窗口中,但它有点不对劲。我这样称呼它。exec(事件->小部件()->mapToGlobal(事件->位置().toPoint());我可以手动添加一些偏移量使其看起来更接近,但我想知道现在是否有更好的方法来执行此操作。@RidesTheShortBus噢,我没有注意到这是一个
QGraphicsSceneousSeevent
。但我认为
screenPos()
是等效的。已编辑我的答案。QContextMenuEvent有一个globalPos()成员。根据我的经验,QMenu.exec()不会在应用程序窗口之外打开菜单。对于用户按ContextMenuKey发出的QContextMenuEvent,当指针位于应用程序窗口之外时,事件的pos()为(0,0),与globalPos()不一致。可能是人机界面指南说你不应该在应用程序窗口之外打开菜单,而Qt正在强制执行这一点?这是相关的,但与您的问题不同。我的错误:(0,0)与globalPos()一致,但不是鼠标的准确位置。此外,您还可以在窗口外打开菜单,例如在QCursor.pos(),即鼠标的当前位置,而不是创建事件时鼠标的不准确位置。在windows之外打开菜单可能没有多大的用户界面意义。