Russian Qt Forum

Qt => Вопросы новичков => Тема начата: User162 от Декабрь 19, 2013, 21:06



Название: Проверка формы на валидность
Отправлено: User162 от Декабрь 19, 2013, 21:06
Всем привет!
Есть некая регистрационная форма (ФИО, адрес и т д ). В ней находится GroupBox. В этом боксе поля:
(QLabel)            (QLineEdit)
ФИО
Дата рождения
Вес
Номер полиса

Адрес            (QTextEdit)
Пол               (QRadioButton)

Надо сделать проверку, на то что все поля заполнены (не пустые). А напротив пустого поля, подсветить Лэйбл красным цветом.
Вот мой код:
Код:
bool MainWindow::CheckFormValid()
{
    QWidget *w = this->findChild< QWidget * >("groupBox");
    QList< QLineEdit * > l1 = w->findChildren< QLineEdit * >();
    QList< QLabel * > l2 = w->findChildren< QLabel * >();
        for (int i = 0; i < l1.size(); i++)
        {
            l2[i]->setStyleSheet("color: black");
            if (l1[i]->text() == "")
            {
                qDebug()<<i<<"isEmpty";
                /* if QMessageBox::Yes == */QMessageBox(QMessageBox::Information, "Test", "Не заполнено поле: " + l2[i]->text(), QMessageBox::Ok).exec();
                l1[i]->setFocus();
                l2[i]->setStyleSheet("color: red");
                ui->pushButton->setChecked(false);
                return false;
                break;
            }
            else
                l2[i]->setStyleSheet("color: black");
        }
return true;
}

в этом коде я проверяю в гроупбоксе все контрлы QLineEdit и сопоставляю номера Лэйблов
Делал через дизайнер.

Подсветка срабатывает, даже если поле заполнено. Помогите, что то не разберусь!


Название: Re: Проверка формы на валидность
Отправлено: kibsoft от Декабрь 19, 2013, 21:45
>>Подсветка срабатывает, даже если поле заполнено.
Т.е. вот это условие
Код:
if (l1[i]->text() == "")
срабатывает даже если text() возвращает непустую строку?


Название: Re: Проверка формы на валидность
Отправлено: User162 от Декабрь 19, 2013, 21:49
какое поле не заполнено определяется верно, т е условие
Код:
if (l1[i]->text() == "")
срабатывает. Просто не те лэйблы подсвечиваются.


Название: Re: Проверка формы на валидность
Отправлено: kibsoft от Декабрь 19, 2013, 22:03
А у вас в групбоксе label'ов такое же количество как и эдитов? Может еще быть такое, что findChildren возвращает в произвольном порядке объекты.
Навскидку, я бы сделал так:
1) Для выравнивания QLabel и QLineEdit использовал бы QFormLayout (в дизайнере он на панели, вместе с остальными)
2) вызывал findChildren<QFormLayout *>
3) получал из объекта QFormLayout эдит и лэйбл используя метод itemAt

В этом случае вы точно получите нужные лэйблы и эдиты.


Название: Re: Проверка формы на валидность
Отправлено: User162 от Декабрь 19, 2013, 22:09
Проверял, если количество эдитов совпадает с количеством лэйблов, и проверил что если лэйблов больше чем эдитов (в моём случае). В коде (в цикле) я считаю сколько эдитов у меня в групбоксе, и полагаю что лэйблов не меньше.
Я записываю компоненты в QList (и лэйблы и эдиты) в надежде обратиться к ним по индексам, а потом просто тупо сравнить. Но не выходит. Такое ощущение что в QList рандомно всё попадает (если вывести в дебаг содержимое, то видно)


Название: Re: Проверка формы на валидность
Отправлено: Alex Custov от Декабрь 19, 2013, 22:11
Подсветка срабатывает, даже если поле заполнено. Помогите, что то не разберусь!

с чего ты взял, что
Код:
l1[i]
будет соответствовать
Код:
l2[i]
?


Название: Re: Проверка формы на валидность
Отправлено: User162 от Декабрь 19, 2013, 22:17
Положился на интуицию.... А если честно, то думал по индексам сравнить... Я уж понял что это неверное решение, как будет правильно???


Название: Re: Проверка формы на валидность
Отправлено: kibsoft от Декабрь 19, 2013, 22:21
Я выше написал как можно. Может еще кто-то что-нибудь предложит, т.к. я с QtWidgets уже года 2 ничего не делал.


Название: Re: Проверка формы на валидность
Отправлено: Bepec от Декабрь 19, 2013, 22:30
Самое простое - назвать их аля label_1 и так далее, добавить в список (как ты делаешь уже) и отсортировать перед использованием :)


Название: Re: Проверка формы на валидность
Отправлено: kambala от Декабрь 19, 2013, 22:54
помести свои UI-компоненты в список/словарь сам (в конструкторе например), а не полагайся на findChildren() — тогда порядок будет 100% правильным


Название: Re: Проверка формы на валидность
Отправлено: ViTech от Декабрь 20, 2013, 12:26
На всякий случай, вдруг пригодится: у QLabel есть buddy (http://qt-project.org/doc/qt-4.8/qlabel.html#setBuddy), который связывает его с каким-то виджетом. Можно пробегать по всем лейблам и проверять связанные с ним поля.


Название: Re: Проверка формы на валидность
Отправлено: User162 от Декабрь 20, 2013, 12:34
Не знаю решена проблема или нет, но решил сделать тест. На форму кинул Групбокс, в него натолкал эдиты и лэйблы, скомпоновал. Далее применил тот код, что выше. И все работает. Единственное что заметил, если удалить один из эдитов, и вставить другой, то порядок нарушится.
Это не есть хорошее решение на мой взгляд. Попробую варианты, которые предложили kibsoft и Bepec.


Название: Re: Проверка формы на валидность
Отправлено: Igors от Декабрь 20, 2013, 13:23
Самое простое - назвать их аля label_1 и так далее, добавить в список (как ты делаешь уже) и отсортировать перед использованием :)
Только не сортировать а просто работать по именам
Код
C++ (Qt)
for (int i = 0; i < maxEdit; ++i) {
QString index = QString::number(i + 1);
QLineEdit * edit = group->findChild<QLineEdit *> ("edit_" + index);
Q_ASSERT(edit);
if (edit->text().size() == 0) {
 QLineEdit * lab = group->findChild<QLabel *> ("label_" + index);
 Q_ASSERT(lab);
// QMessageBox
}
}
А в дызайнере отследить имена


Название: Re: Проверка формы на валидность
Отправлено: Bepec от Декабрь 20, 2013, 13:26
find затратнее обращения по индексу. Потому лучше сначала сложить и отсортировать, а потом без забот пользоваться. И никакие "левые" едиты мешать не будут.


Название: Re: Проверка формы на валидность
Отправлено: Igors от Декабрь 20, 2013, 13:48
find затратнее обращения по индексу. Потому лучше сначала сложить и отсортировать, а потом
"Вспомнила баба как девкой была". Плохо когда программист не чувствует машины


Название: Re: Проверка формы на валидность
Отправлено: ViTech от Декабрь 20, 2013, 22:56
Я бы сделал так: в дизайнере форм в режиме Buddy Editing Mode (http://qt-project.org/doc/qt-4.8/designer-buddy-mode.html) каждому Label поставил в соответствие нужный LineEdit (или еще что надо). И дальше примерно так (псевдокод):
Код
C++ (Qt)
checkFields(QWidget *widget)
{
 QList<QLabel *> labels = widget->findChildren<QLabel *>();
 foreach(QLabel * label, labels)
 {
   QWidget *field = label->buddy();
   if (isFieldEmpty(field))
   {
      //paint label in red color
   }
 }
}