Russian Qt Forum
Ноябрь 26, 2024, 19:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Проверка формы на валидность  (Прочитано 9382 раз)
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 и сопоставляю номера Лэйблов
Делал через дизайнер.

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

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Декабрь 19, 2013, 21:45 »

>>Подсветка срабатывает, даже если поле заполнено.
Т.е. вот это условие
Код:
if (l1[i]->text() == "")
срабатывает даже если text() возвращает непустую строку?
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
User162
Гость
« Ответ #2 : Декабрь 19, 2013, 21:49 »

какое поле не заполнено определяется верно, т е условие
Код:
if (l1[i]->text() == "")
срабатывает. Просто не те лэйблы подсвечиваются.
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Декабрь 19, 2013, 22:03 »

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

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

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
User162
Гость
« Ответ #4 : Декабрь 19, 2013, 22:09 »

Проверял, если количество эдитов совпадает с количеством лэйблов, и проверил что если лэйблов больше чем эдитов (в моём случае). В коде (в цикле) я считаю сколько эдитов у меня в групбоксе, и полагаю что лэйблов не меньше.
Я записываю компоненты в QList (и лэйблы и эдиты) в надежде обратиться к ним по индексам, а потом просто тупо сравнить. Но не выходит. Такое ощущение что в QList рандомно всё попадает (если вывести в дебаг содержимое, то видно)
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Декабрь 19, 2013, 22:11 »

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

с чего ты взял, что
Код:
l1[i]
будет соответствовать
Код:
l2[i]
?
Записан
User162
Гость
« Ответ #6 : Декабрь 19, 2013, 22:17 »

Положился на интуицию.... А если честно, то думал по индексам сравнить... Я уж понял что это неверное решение, как будет правильно???
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #7 : Декабрь 19, 2013, 22:21 »

Я выше написал как можно. Может еще кто-то что-нибудь предложит, т.к. я с QtWidgets уже года 2 ничего не делал.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Bepec
Гость
« Ответ #8 : Декабрь 19, 2013, 22:30 »

Самое простое - назвать их аля label_1 и так далее, добавить в список (как ты делаешь уже) и отсортировать перед использованием Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Декабрь 19, 2013, 22:54 »

помести свои UI-компоненты в список/словарь сам (в конструкторе например), а не полагайся на findChildren() — тогда порядок будет 100% правильным
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #10 : Декабрь 20, 2013, 12:26 »

На всякий случай, вдруг пригодится: у QLabel есть buddy, который связывает его с каким-то виджетом. Можно пробегать по всем лейблам и проверять связанные с ним поля.
Записан

Пока сам не сделаешь...
User162
Гость
« Ответ #11 : Декабрь 20, 2013, 12:34 »

Не знаю решена проблема или нет, но решил сделать тест. На форму кинул Групбокс, в него натолкал эдиты и лэйблы, скомпоновал. Далее применил тот код, что выше. И все работает. Единственное что заметил, если удалить один из эдитов, и вставить другой, то порядок нарушится.
Это не есть хорошее решение на мой взгляд. Попробую варианты, которые предложили kibsoft и Bepec.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Декабрь 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
}
}
А в дызайнере отследить имена
Записан
Bepec
Гость
« Ответ #13 : Декабрь 20, 2013, 13:26 »

find затратнее обращения по индексу. Потому лучше сначала сложить и отсортировать, а потом без забот пользоваться. И никакие "левые" едиты мешать не будут.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Декабрь 20, 2013, 13:48 »

find затратнее обращения по индексу. Потому лучше сначала сложить и отсортировать, а потом
"Вспомнила баба как девкой была". Плохо когда программист не чувствует машины
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 23.