Qt — перебор QRadioButtons

У меня есть групповой проект для школы, над которым я работаю. Член моей группы создал окно с примерно 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 и т. д.


person Nedlinin    schedule 08.04.2011    source источник
comment
Здесь аналогичный, более общий вопрос об итерации объектов определенного типа в макете.   -  person Kuba hasn't forgotten Monica    schedule 21.07.2015


Ответы (2)


Используйте QButtonGroup, установите для него монопольный (тогда только один переключатель будет проверяться в время). Это также дает вам текущую отмеченную кнопку, если вы тоже хотите снять ее. (чтобы вообще не было отмеченных кнопок).

Также обратите внимание, что вы, вероятно, хотите изменить свойство «checked», а не «checkable» (где false означает, что кнопка вообще не может быть отмечена/снята).

person Frank Osterfeld    schedule 08.04.2011
comment
Ух ты, я чувствую себя глупо из-за того, что не нашел этого в документации. Есть ли простой способ конвертировать QGroupBox в QButtonGroup? Он сделал все это с помощью редактора пользовательского интерфейса, иначе мы могли бы просто изменить типы. - person Nedlinin; 08.04.2011
comment
QButtonGroup — это не виджет, а просто QObject, управляющий состояниями кнопок. Таким образом, кнопки могут оставаться в групповом поле. Эксклюзивных кнопок недостаточно? Это должно быть по умолчанию, если вы добавляете их в любой виджет, включая групповые поля. - person Frank Osterfeld; 08.04.2011
comment
Ах. Отлично, я искал виджет для добавления в пользовательский интерфейс. Очень ценю помощь! Решил мою проблему :) - person Nedlinin; 08.04.2011

Если вам не нравится использовать 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)

person DomTomCat    schedule 11.07.2015