Как обойти в цикле все QCheckBox

150
07 марта 2019, 23:40

Я добавил в окно 10 чекбоксов в режиме дизайнера. Это объекты checkbox1,checkbox2,...,checkbox10, не являющиеся массивом. Как мне проверить состояние каждого чекбокса в цикле?

Answer 1

Чтобы обойти все дочерние объекты определённого типа можно использовать QObject::findWidget. Пример:

for (auto child: parentWidget.findChildren<QCheckBox*>())
{
    // Работаем с child как QCheckBox*
    if (child->isChecked()) ...
}
Answer 2

Если категорически не хочется создавать форму процедурно, то можно перебирать дочерние элементы. Метод

QObjectList &QObject::children()

вам в помощь. QObjectList объявлен в Qt вот так

typedef QList<QObject*> QObjectList;

Далее перебираем элементы в поисках элементов с нужным именем (далее код выполняем внутри класса окна после инициализации ui). Если найден нужный объект, то преобразуем его в QCheckBox c помощью qobject_cast. Можно сразу поместить указатели на них в QList или QMap.

QObjectList childs = this->children();
QMap<QString, QCheckBox*> boxMap;
QList<QCheckBox*> boxList;
QList<QObject*>::iterator i;
for (i = list.begin(); i != list.end(); ++i){
    if (i->objectName().left(8) == "checkbox"){
        QCheckBox *box = qobject_cast<QCheckBox *>(i);
        if (box){
            boxMap[box->objectName()] = box;
            boxList.append(box);
        }
    }
}

Также можно использовать findChild, чтобы получить указатели на дочерние элементы по имени и классу или findChildren для поиска дочерних элементов хоть по строке хоть по RegExp.

READ ALSO
Отличия передачи указателя на функцию в функцию

Отличия передачи указателя на функцию в функцию

В чем разница двух этих конструкций

171
ИЗ Little endian в big-endian

ИЗ Little endian в big-endian

Нужно перевести число из Little endian в big-endianДано изначально 32 битное число представленное в десятичном виде

184
Доступ к внутреннем данным элемента TreeView

Доступ к внутреннем данным элемента TreeView

Подскажите чайнику,пожалуйста, как обойти ситуациюВ своем приложении решил создать иерархическую структуру данных

205