Qt - 迭代QRadioButtons

时间:2011-04-08 17:11:05

标签: c++ qt iterator qobject qradiobutton

我正在为学校开展一个小组项目。我小组的一名成员创建了一个有~75个单选按钮的窗口。我想强迫所有人在按下按钮时“清除”或“未选中”。

有没有人知道这样做的好方法?我一直在研究QObjectList,但我不能简单地做QObjectList * children = new QObjectList(ui-> groupBox-> children());并使用for循环循环它们,因为QObjectList似乎没有下一个方法..

我也尝试过像

这样的事情
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等。

2 个答案:

答案 0 :(得分:3)

使用QButtonGroup,将其设置为独占(然后一次只检查一个单选按钮)。它还为您提供当前选中的按钮,以防您想要取消选中它。 (根本没有检查按钮)。

另请注意,您可能要修改的是“已检查”属性,而不是“可检查”(其中false表示根本无法选中/取消选中该按钮)。

答案 1 :(得分: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);
    }
}

您很可能需要操纵自动排除(如上面的代码块所示)以取消选中所有单选按钮(另请参阅@ Kristofer的答案:https://stackoverflow.com/a/9375491/1150303