【问题标题】:QMenu being displayed outside the main windowQMenu 显示在主窗口之外
【发布时间】:2013-11-19 17:47:53
【问题描述】:

我正在使用自定义 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());
    }
}

但菜单显示在主应用程序窗口之外,靠近我的另一台显示器的右下角。当我使用注释掉的版本时,它会出现在我的主窗口顶部。我已经尝试手动调整点以在窗口内按摩它,但它只会跳到窗口顶部或从底部悬挂,永远不会在里面。

【问题讨论】:

    标签: qt qt4 qmenu


    【解决方案1】:

    QMenu::exec 全球定位;您正在获取小部件的相对位置并将其映射到场景位置。

    试试这个:

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

    【讨论】:

    • 什么类型的事件有 globalPos() 成员函数?我能够让我的 QMenu 最终显示在主窗口中,但它有点偏离。我这样称呼它 menu.exec(event->widget()->mapToGlobal(event->pos().toPoint()));我可以手动添加一些偏移量以使其看起来接近,但我想知道现在是否有更好的方法来做到这一点。
    • @RidesTheShortBus 哦,我没注意到这是QGraphicsSceneMouseEvent。但我认为screenPos() 是等价的。编辑了我的答案。
    • QContextMenuEvent 有一个 globalPos() 成员。根据我的经验, QMenu.exec() 不会在应用程序窗口之外打开菜单。对于来自用户按下 ContextMenuKey 的 QContextMenuEvent,当指针位于应用程序窗口之外时,事件的 pos() 为 (0,0),与 globalPos() 不一致。可能人机界面指南说您不应该在应用程序窗口之外打开菜单,而 Qt 强制执行此操作?这是相关的,但与您的问题不同。
    • 我的错误:(0,0) 确实与 globalPos() 一致,但它不是鼠标的准确位置。此外,您可以在窗口外打开一个菜单,例如在 QCursor.pos() 处,即鼠标的当前位置,而不是创建事件时鼠标的不准确位置。在窗口外打开菜单可能没有太大的用户界面意义。
    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多