QActionGroup类将actions分组。

    在某些情况下将QAction分组是十分有用的。例如,如果你有一个Left Align的action,一个Right Align的action,一个Justify的action,以及一个Center action,在统一时刻所有这些actions只能有一个被激活。一种简便的做法就是将这些actions以分组的方式组织。

    下面是一个示例:

    1. alignmentGroup = new QActionGroup(this);
    2. alignmentGroup->addAction(leftAlignAct);
    3. alignmentGroup->addAction(rightAlignAct);
    4. alignmentGroup->addAction(justifyAct);
    5. alignmentGroup->addAction(centerAct);
    6. leftAlignAct->setChecked(true);

    在上面的示例中,我们创建了一个action组。由于action group默认是互斥的,因此在同一时刻只有一个会被选中。

    当组内的某个action被选中的时候,QActionGroup就会发射triggered()信号。通常情况下,组内的每个action发射自己的triggered()信号。

    正如上面提到的,action group默认是互斥的;它确保在同一时刻只有一个action会被选中。如果你想创建一个action group而不想时它们是互斥关系,那么你可以通过调用setExclusive(false)来关闭互斥关系。

    可以使用addAction()函数将action添加到action group中,然而更常见的做法是在创建action的时候指定一个group;这确保了这些actions具有同一个父亲。可以通过在group中添加分割线使得各个action分开显示,可以使用QAction的setSeparator()添加分割线。通常使用QWidget::addActions()函数将action group添加到窗口部件上。

    1. /* 初始化Action菜单 */
    2. actionMenu = new QMenu("Action");
    3. leftAction = new QAction("Left", this);
    4. rightAction = new QAction("Right", this);
    5. centerAction = new QAction("Center", this);
    6. justifyAction = new QAction("Justify", this);
    7. actionGroup = new QActionGroup(this);
    8. actionMenu->addAction(actionGroup->addAction(leftAction));
    9. actionMenu->addAction(actionGroup->addAction(rightAction));
    10. actionMenu->addAction(actionGroup->addAction(centerAction));
    11. actionMenu->addAction(actionGroup->addAction(justifyAction));

    可以使用下面的槽函数验证默认情况下,一次只有一个action可以被选中。当然也可以验证action的bool isExclusive() const 为 false,使得一次可以选中多个:

    1. void MainWindow::initConnect()
    2. {
    3. connect(fileOpenAction, &QAction::triggered, this, &QAction::sendActivate);
    4. connect(fileSaveAction, &QAction::hovered, this, &QAction::ansHovered);
    5. connect(leftAction, &QAction::triggered, this, &QAction::ansTriggered);
    6. connect(rightAction, &QAction::triggered, this, &QAction::ansTriggered);
    7. connect(centerAction, &QAction::triggered, this, &QAction::ansTriggered);
    8. connect(justifyAction, &QAction::triggered, this, &QAction::ansTriggered);
    9. }

    备注:

    • 放置到ActionGroup中就默认是exclusive。