Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何取消选中Qt上操作组菜单上的所有操作?_Qt_Menu_Qactiongroup - Fatal编程技术网

如何取消选中Qt上操作组菜单上的所有操作?

如何取消选中Qt上操作组菜单上的所有操作?,qt,menu,qactiongroup,Qt,Menu,Qactiongroup,我有一个方法可以自动在菜单上添加可检查的操作,它工作得很好。我只是想知道如何自动取消所有这些操作。我知道可以使用ui->action\u item->setChecked(false),但在这种情况下,我应该知道并在代码中写入每个操作名称,但这对我来说是不可行的 伪代码: void MainWindow::AddNewActions() { QActionGroup *my_action_group = new QActionGroup(this); my_action_grou

我有一个方法可以自动在菜单上添加可检查的操作,它工作得很好。我只是想知道如何自动取消所有这些操作。我知道可以使用
ui->action\u 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);
    }
}

您需要获取操作列表,然后取消选中每个操作。操作列表只是菜单的
QAction
子项列表,但如果它们不属于某个操作组,则是如此。那就是:

void Class::method2() {
  auto actions = std::as_const(ui_->my_menu->findChildren<QAction*>());
  for (auto *action : actions)
    action->setChecked(false);
}
void类::method2(){
自动操作=std::as_const(用户界面->我的菜单->findChildren());
用于(自动*动作:动作)
操作->设置检查(假);
}
如果要在特定操作组中查找操作,则需要使用唯一名称命名该操作组,以便以后参考:

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);
}
static const QString k_my_action_group{QLatin1String(“my_action_group”);
void类::method1(){
auto*my_action_group=新QActionGroup{this};
my_action_group->setObjectName(k_my_action_group);
...
}
void类::method2(){
if(auto*group=findChild(k_my_action_group))
如果(自动*action=group->checkedAction())
操作->设置检查(假);
}
如果您有多个组,它们可以共享相同的名称,然后您也可以迭代它们:

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);
}
void Class::method2(){//如果可以检查多个操作
自动组=std::as_const(findChildren(k_my_action_group));
用于(自动*组:组)
如果(自动*action=group->checkedAction())
操作->设置检查(假);
}
如果编译器尚未实现std::as_const,请改用
qAsConst
。const casting是Qt容器隐式共享设计的不幸结果


在多个位置引用的对象名称应用作具有符号名称的字符串常量。这使得在编译时可以检测到输入错误,而不是在运行时。我实现了一个最简单的解决方案:

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

foreach (QMenu* menu, menus)
{
    foreach (QAction* action, menu->actions())
    {
        if(action->isCheckable()){
        action->setChecked(false);
        }
    }
}
QList菜单;
菜单=ui->menuBar->findChildren();
foreach(QMenu*菜单,菜单)
{
foreach(QAction*操作,菜单->操作()
{
如果(操作->可检查(){
操作->设置检查(假);
}
}
}

什么是
ui->action\u项目
?除了提供