Используйте QObject, найденный по его QObjectName

У меня есть небольшая проблема в моей программе. У меня есть файл конфигурации, помещенный в настройки. Я вытаскиваю из него имена объектов, которые мне нужно проверить (это QCheckBox). У меня есть этот фрагмент кода (он компилируется и запускается, но когда он находится в «cBox-> setChecked», он просто падает):

void Preproc::on_tBtnManual_toggled(bool checked){

if(checked){
    ui->tBtnManual->setText("Systematic");
}else{
    ui->tBtnManual->setText("Manual");
    settings.beginGroup("Preprocessing");
    QStringList keys = settings.childKeys();
    foreach(QString configParam,keys){
        QCheckBox *cBox = ui->gridLayout->findChild<QCheckBox *>(configParam);
        cBox->setChecked(settings.value(configParam).toBool());
    }
 }

}

Я пробовал поставить ui->cBox->... поставить говорит, что cBox не является дочерним элементом ui. Если я qDebug (cBox), у меня есть QObject (0x0), так что ничего!

Я немного новичок в Qt, так что, может быть, это простая вещь. Спасибо, и хорошего дня :)


person Pico    schedule 07.06.2013    source источник


Ответы (2)


Вы уверены, что объект найден? Я так не думаю (другое имя? неправильный макет?). cBox равен 0x0, когда ничего не найдено. Однако положить

if (cBox)

до

cBox->setChecked(settings.value(configParam).toBool());

и он больше не будет падать, если не найдет объект по имени.

person asclepix    schedule 07.06.2013
comment
Да, он больше не зависал, но у меня все еще есть нуль QObject. Я проверил имя, и они хороши. - person Pico; 07.06.2013

Вы уверены, что имя (содержимое configParam) правильное? можно попробовать поиск из QApplication

QApplication::instance()->findChild<QCheckBox *>(configParam);

метод findChild выполняет рекурсивный поиск, если объект существует в hirachie, он будет найден. если объект не найден, это может быть:

  • объект не существует
  • объект имеет другое имя
  • объект или один из его предков не имеет родителя (NULL)

Вы можете опубликовать часть файла .ui с флажком? это было бы полезно.

person WoJo    schedule 07.06.2013
comment
Вот мой settings.ini, откуда он берет свои параметры [Preprocessing] cBoxGain=true cBoxMask=true - person Pico; 07.06.2013
comment
<item> <layout class="QGridLayout" name="gridLayout"> <item row="4" column="0"> <widget class="QCheckBox" name="cBoxGain"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>Gain Error</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> </layout> </item> Я сократил свой код, удалив другие QcheckBox. Также я всегда получал один и тот же нулевой объект с вашим кодом - person Pico; 07.06.2013
comment
вы искали cBox (ui-›cBox-›...), но имя name="cBoxGain" попробуйте ui-›cBoxGain (или findChild<QCheckBox*>("cBoxGain") ) - person WoJo; 09.06.2013