QMenu和子菜单在另一个监视器位置打开

问题描述

我构建了一个使用QMenu及其相关子菜单的应用程序。通过Qmenu触发QAction打开。

问题,我遇到的问题是,一旦我致电QAction并选择了带有“选项”的QAction,它就会打开{{1 }},但代替QMenu在应用程序的另一个位置打开,看上去完全分离。

以下是错误行为,在该行为中,可能会看到QMenu在桌面的其他位置打开。

worng

这是预期行为,其中在选择“ Oprions”后打开QMenu

correct

我不确定为什么会这样。 在相关代码段的下方:

rostreewidget.h

QMenu

rostreewidget.cpp

    class ROSTreeWidget : public QTreeWidget
    {
        Q_OBJECT

    public:
        enum ROSType {
            NULLPTR,TABLE,BASE,MENU
        };

        ROSTreeWidget(QWidget *parent = nullptr);
        ROSType rostype(ROSTreeItem *rosItem) const;
        ROSType rostype() const {
            return rostype(currentItem());
        }

    signals:
        void selectFrom();
        void editLaserTable();

    private:
        QAction *mActionSELECT_FROM;
        QAction *mActionEditLaserTable;
        QAction *mAddMenuOptions;

        QMenu *submenuLaserScanA;
        QAction *submenuActionA,*submenuActionB,*submenuActionC;
        QMenu *submenuLaserScanB;
        QAction *submenuActionAA,*submenuActionBB,*submenuActionCC;
        QMenu *submenuLaserScanC;
        QAction *submenuActionAAA,*submenuActionBBB,*submenuActionCCC;

    };

到目前为止我所做的:

  1. 在遵循this的源代码之后,我能够准备要插入ROSTreeWidget::ROSTreeWidget(QWidget *parent) : QTreeWidget(parent) { mActionSELECT_FROM = new QAction(QIcon(":"),"SELECT * FROM",this); mActionEditLaserTable = new QAction(QIcon(":"),"Edit LaserScan Table"); mAddMenuOptions = new QAction(QIcon(":"),"Options",this); addActions({ mActionSELECT_FROM,mActionEditLaserTable,mAddMenuOptions}); connect(mActionSELECT_FROM,&QAction::triggered,[&]() { emit selectFrom(); }); connect(mActionEditLaserTable,[&]() { emit editLaserTable(); }); connect(mAddMenuOptions,[&]() { mMenu = new QMenu(); submenuLaserScanA = mMenu->addMenu( "Menu A" ); mMenu->addSeparator(); submenuLaserScanB = mMenu->addMenu( "Menu B" ); mMenu->addSeparator(); submenuLaserScanC = mMenu->addMenu( "Menu C" ); submenuActionAAA = submenuLaserScanC->addAction("Setup C" ); submenuActionBBB = submenuLaserScanC->addAction( "Setup C" ); mMenu->show(); }); } 菜单和子菜单,实际上,与之相关的所有设置都是我需要的

  2. 我认为,像我在其他选择中所做的那样,将la QAction链接到lambda函数中是可行的,但是我启动应用程序后立即获得的是{ {1}}会在桌面的其他位置打开,而不会链接到主选项,如下所示。

  3. 根据文档QMenu::addMenu设置的参数正确,那么怎么回事?

感谢您指出解决此问题的正确方向。

解决方法

将此用作常规模式:

{
    QMenu menu;
    
    menu.addAction(...);
    menu.addAction(...);
    
    menu.exec(QCursor::pos()); // exec returns a triggered QAction
    // process action
}

QMenu::exec()是模态的。您不需要在函数外部的QMenu实例。