Qt - 遍历 QRadioButtons

3

我正在为学校做一个小组项目。我的小组成员创建了一个窗口,里面有大约75个单选按钮。我想在按下按钮时强制所有单选按钮都变为“清除”或“未选中”状态。

有人知道如何做到这一点吗?我一直在研究QObjectList,但是我不能简单地使用QObjectList *children = new QObjectList(ui->groupBox->children());并使用for循环对它们进行循环,因为QObjectList似乎没有next方法。

我还尝试过类似以下的操作:

QObjectList *children = new QObjectList(ui->groupBox->children());
for(QObject *iterator = children.first(); iterator!=NULL; children.pop_front()){
    iterator = children.first();
    iterator->at(0)->setCheckabled(false);
}

但是由于迭代器是QObject,所以setCheckable不像单选按钮那样存在。

欢迎提供想法/提示。

编辑:我甚至可以接受一个提示,以便遍历具有类似名称的变量。例如,我的所有单选按钮都命名为RadioButton_1、RadioButton_2等。


1
这是一个关于在布局中迭代特定类型对象的类似且更一般化的问题,可以参考这里:https://dev59.com/qI3da4cB1Zd3GeqPxD_H。 - Kuba hasn't forgotten Monica
2个回答

3
使用QButtonGroup,将其设置为独占模式(这样一次只能选择一个单选按钮)。它还提供了当前被选中的按钮,以便您也可以取消选择(没有任何选定的按钮)。
此外,请注意您可能想要修改的是“checked”属性,而不是“checkable”属性(其中false表示根本无法选中/取消选中该按钮)。

哦,哇,我感到很愚蠢,因为我没有在文档中找到那个。有没有一种简单的方法可以从QGroupBox转换为QButtonGroup?他使用UI编辑器制作了整个内容,否则我们可以简单地更改类型。 - Nedlinin
QButtonGroup不是小部件,只是管理按钮状态的QObject。因此,按钮可以留在组框中。拥有互斥按钮还不够吗?如果将它们添加到任何小部件(包括组框)中,则应该是默认值。 - Frank Osterfeld
啊,太棒了,我正在寻找一个可以添加到用户界面的小部件。非常感谢您的帮助!我的问题得到了解决 :) - Nedlinin

1

如果您不喜欢使用QButtonGroup(因为设置麻烦或其他原因),那么可以使用以下迭代方式:

QListIterator<QObject *> i(ui->groupBox->children());
while (i.hasNext())
{
    QRadioButton* b = qobject_cast<QRadioButton*>( i.next() );
    if (b > 0 && b->isChecked()) {
        b->setAutoExclusive(false);
        b->setChecked(false);
        b->setAutoExclusive(true);
    }
}

很可能需要操作autoexclusive(如上面的代码块所做)以取消所有单选按钮(还可以参见@Kristofer的答案:https://dev59.com/o2ox5IYBdhLWcg3wLhei#9375491)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接