Как снять галочку со всех действий в меню группы действий в Qt?

У меня есть метод автоматического добавления проверяемых действий в меню, и он работает отлично. Мне просто нравится знать, как снять все эти действия автоматически. Я знаю, что это возможно с ui->action_item->setChecked(false) но в этом случае я должен знать и записывать каждое имя действия в коде, однако это не подходит для меня.

Псевдо-код:

void MainWindow::AddNewActions() {
    QActionGroup *my_action_group = new QActionGroup(this);
    my_action_group->setExclusive(true);

    foreach (..) {
        QAction *my_new_action = new QAction(description, my_action_group);
        my_new_action->setCheckable(true);
        my_new_action->setData(action_name);

        ui_->my_menu->addAction(my_new_action);
    }
}

2 ответа

Я реализовал простейшее решение:

    QList<QMenu*> menus;
menus = ui->menuBar->findChildren<QMenu*>();

foreach (QMenu* menu, menus)
{
    foreach (QAction* action, menu->actions())
    {
        if(action->isCheckable()){
        action->setChecked(false);
        }
    }
}

Вам нужно получить список действий, а затем снять все флажки. Список действий - это просто список QAction дети меню - но это если они не принадлежат к группе действий. Это было бы тогда:

void Class::method2() {
  auto actions = std::as_const(ui_->my_menu->findChildren<QAction*>());
  for (auto *action : actions)
    action->setChecked(false);
}

Если вы хотите найти действия в определенной группе действий, вам нужно присвоить группе действий уникальное имя, чтобы обратиться к ней позже:

static const QString k_my_action_group{QLatin1String("my_action_group")};

void Class::method1() {
  auto *my_action_group = new QActionGroup{this};
  my_action_group->setObjectName(k_my_action_group);
  ...
}

void Class::method2() {
  if (auto *group = findChild<QActionGroup*>(k_my_action_group))
    if (auto *action = group->checkedAction())
      action->setChecked(false);
}

Если у вас есть несколько групп, они могут иметь одно и то же имя, а затем вы их итерируете:

void Class::method2() { // if somehow more than one action can be checked
  auto groups = std::as_const(findChildren<QActionGroup*>(k_my_action_group));
  for (auto *group : groups)
    if (auto *action = group->checkedAction())
      action->setChecked(false);
}

Если ваш компилятор не реализует std::as_const пока пользуйся qAsConst вместо. Преобразование констант - неудачный эффект неявного общего дизайна контейнеров Qt.

Имена объектов, на которые ссылаются в нескольких местах, должны использоваться как строковые константы с символическими именами. Это делает опечатки обнаруживаемыми во время компиляции, а не во время выполнения.

Другие вопросы по тегам