在选定的 QMenu 项目上显示刻度图像

Display tick image on selected QMenu item

本文关键字:显示 图像 项目 QMenu      更新时间:2023-10-16

我想在从我的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是否有一些默认方法,或者我需要保留小部件或图像。

您必须通过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中都有效。