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();
});
}
到目前为止我做了什么:
在遵循 this 源代码后,我能够准备要插入到 QAction
中的菜单和子菜单,事实上所有相关设置都与我相同需要他们。
我认为在 lambda 函数中链接 QAction
就像我对其他选择所做的那样,会奏效,但我一启动应用程序是一个 QMenu
,它在桌面的另一个位置打开,但没有链接到主选项,如下所示。
根据文档QMenu::addMenu设置的参数是正确的,这是怎么回事?
感谢您指出解决此问题的正确方向。
将其用作一般模式:
{
QMenu menu;
menu.addAction(...);
menu.addAction(...);
menu.exec(QCursor::pos()); // exec returns a triggered QAction
// process action
}
QMenu::exec()
是模态的。您不需要函数外的 QMenu 实例。
我构建了一个使用 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();
});
}
到目前为止我做了什么:
在遵循 this 源代码后,我能够准备要插入到
QAction
中的菜单和子菜单,事实上所有相关设置都与我相同需要他们。我认为在 lambda 函数中链接
QAction
就像我对其他选择所做的那样,会奏效,但我一启动应用程序是一个QMenu
,它在桌面的另一个位置打开,但没有链接到主选项,如下所示。根据文档QMenu::addMenu设置的参数是正确的,这是怎么回事?
感谢您指出解决此问题的正确方向。
将其用作一般模式:
{
QMenu menu;
menu.addAction(...);
menu.addAction(...);
menu.exec(QCursor::pos()); // exec returns a triggered QAction
// process action
}
QMenu::exec()
是模态的。您不需要函数外的 QMenu 实例。