在选定的QMenu项

时间:2017-07-10 09:56:17

标签: c++ qt qt4

我想在我的QMenu选择特定项目时显示一个勾选项目。 目前它显示菜单,但我还需要保持一定的好处,以便下次用户可以知道之前选择的菜单。

QMenu *preferenceMenu = new QMenu();
preferenceMenu  = editMenu->addMenu(tr("&Preferences"));

QMenu *Mode1 = new QMenu();
Mode1  = preferenceMenu->addMenu(tr("&Mode 1"));
Mode1->addAction(new QAction(tr("&Menu1"), this));

QMenu *Mode2 = new QMenu();
Mode2  = preferenceMenu->addMenu(tr("&Mode 2"));
Mode2->addAction(new QAction(tr("&Menu2"), this));
Mode2->addAction(new QAction(tr("&Menu3"), this));

QAction上,我拨打了广告位slotActionTriggered(QAction* actionSelected)

void csTitleBar::slotActionTriggered(QAction* actionSelected)
{
   actionSelected->setChecked(true);
}

如果我选择Menu3,则勾选也应显示在Menu3的右侧,如果我更改为Menu2,则勾选应显示在Menu2上并从Menu3

请提供一些想法,Qt是否有一些默认方法来执行此操作,或者我需要保留小部件或图像。

1 个答案:

答案 0 :(得分:1)

您必须通过QAction::setCheckable进行可检查行动。

QMenu *Mode2 = new QMenu();
Mode2  = preferenceMenu->addMenu(tr("&Mode 2"));
Mode2->addAction(new QAction(tr("&Menu2"), this));
Mode2->actions().back()->setCheckable(true);
Mode2->addAction(new QAction(tr("&Menu3"), this));
Mode2->actions().back()->setCheckable(true);

此外,您无需在您的情况下手动检查操作,将其标记为可检查已完成作业。

正如@G.M.所述,为了使其中一些互斥,您必须为每个集合创建QActionGroup(在您的情况下为Menu2Menu3)。只需将操作组设置为操作的父级,或者调用QActionGroup::addAction

  QMenu* Mode2 = new QMenu();
  QActionGroup* Mode2ActionGroup = new QActionGroup(Mode2);
  Mode2  = preferenceMenu->addMenu(tr("&Mode 2"));
  Mode2->addAction(new QAction(tr("&Menu2"), Mode2ActionGroup));
  Mode2->actions().back()->setCheckable(true);
  Mode2->addAction(new QAction(tr("&Menu3"), Mode2ActionGroup));
  Mode2->actions().back()->setCheckable(true);

PS:虽然链接重定向到Qt 5.xx文档,但解决方案适用于Qt 4.8和Qt 5.xx。