QMenu(和子菜单)在不同的监视器位置打开

QMenu (and submenu) opens up in a different monitor location

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

我遇到的问题是,一旦我调用QAction并选择带有“选项”的QAction,它应该打开 QMenu,但 而不是 QMenu 在应用程序的另一个位置打开,看起来完全分离。

下面是错误的行为,可以看到QMenu在桌面的另一个位置打开。

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

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

rostreewidget.h

    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;

    };

rostreewidget.cpp

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, &QAction::triggered, [&]() {
        emit editLaserTable();
    });

    connect(mAddMenuOptions, &QAction::triggered, [&]() {
        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();
    });
}

到目前为止我做了什么:

  1. 在遵循 this 源代码后,我能够准备要插入到 QAction 中的菜单和子菜单,事实上所有相关设置都与我相同需要他们。

  2. 我认为在 lambda 函数中链接 QAction 就像我对其他选择所做的那样,会奏效,但我一启动应用程序是一个 QMenu,它在桌面的另一个位置打开,但没有链接到主选项,如下所示。

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

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

将其用作一般模式:

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

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