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

标签 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);
}

在这里,如果我选择 Menu3Menu3 的右侧也应该出现一个勾号,稍后如果我更改为 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)。只需将 Action 组设置为 Action 的父级或调用 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 中均有效。

关于c++ - 在选定的 QMenu 项目上显示刻度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45009003/

相关文章:

qt - Windows 中的 qt 调试器?

c++ - 识别 QAction 的触发器

c++ - QPixmap 加载不起作用

c++ - 在开源应用程序中使用功能区界面

c++ - OpenGL 着色器错误 1282

android - Qt Creator 2.8.1 在 Ubuntu 13.10 上看不到三星 galaxy s4

c++ - 无法打开QImage源文件

c++ - 显示来自 api 返回数据的特定数据,C++ REST SDK a.k.a Casablanka

c++ - 如何使用 std::cout 或 std::ofstream 作为单个函数的输入?

c++ - 为什么 Qt::AlignTop 在我像主布局一样使用的 QVBoxLayout 中不起作用?