Как снять галочку со всех действий в меню группы действий в 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.
Имена объектов, на которые ссылаются в нескольких местах, должны использоваться как строковые константы с символическими именами. Это делает опечатки обнаруживаемыми во время компиляции, а не во время выполнения.