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, задайте го на изключителен (тогава само един радиобутон ще бъде маркиран на време). Той също така ви дава текущо маркирания бутон, в случай че искате да премахнете отметката и от него. (да няма изобщо маркирани бутони).

Също така имайте предвид, че това, което вероятно искате да промените, е свойството "проверено", а не "проверено" (където 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);
    }
}

Най-вероятно трябва да манипулирате autoexclusive (както е направено в горния кодов блок), за да премахнете отметката от всички радио бутони (вижте също отговора на @Kristofer: https://stackoverflow.com/a/9375491/1150303)

person DomTomCat    schedule 11.07.2015