Qt - перебирать QRadioButtons - PullRequest
       50

Qt - перебирать QRadioButtons

3 голосов
/ 08 апреля 2011

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

Мысли / советы будут оценены.

Edit: я даже намекаю на способ перебора переменных с похожими именами Например, все мои радиокнопки называются RadioButton_1, RadioButton_2 и т. Д.

Ответы [ 2 ]

3 голосов
/ 08 апреля 2011

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

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

1 голос
/ 11 июля 2015

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

Скорее всего, вам нужно манипулировать автоэксклюзией (как это сделано в приведенном выше блоке кода), чтобы все переключатели были сняты (см. Также ответ @ Кристофер: https://stackoverflow.com/a/9375491/1150303)

...