问题描述
我构建了一个使用QMenu
及其相关子菜单的应用程序。通过Qmenu
触发QAction
打开。
问题,我遇到的问题是,一旦我致电QAction
并选择了带有“选项”的QAction
,它就会打开{{1 }},但代替,QMenu
在应用程序的另一个位置打开,看上去完全分离。
以下是错误行为,在该行为中,可能会看到QMenu
在桌面的其他位置打开。
这是预期行为,其中在选择“ Oprions”后打开QMenu
:
我不确定为什么会这样。 在相关代码段的下方:
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;
};
到目前为止我所做的:
-
在遵循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(); }); }
的菜单和子菜单,实际上,与之相关的所有设置都是我需要的 -
我认为,像我在其他选择中所做的那样,将la
QAction
链接到lambda函数中是可行的,但是我启动应用程序后立即获得的是{ {1}}会在桌面的其他位置打开,而不会链接到主选项,如下所示。 -
根据文档QMenu::addMenu设置的参数正确,那么怎么回事?
感谢您指出解决此问题的正确方向。
解决方法
将此用作常规模式:
{
QMenu menu;
menu.addAction(...);
menu.addAction(...);
menu.exec(QCursor::pos()); // exec returns a triggered QAction
// process action
}
QMenu::exec()
是模态的。您不需要在函数外部的QMenu实例。