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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Дескриптор параметра  (Прочитано 3477 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июнь 08, 2020, 10:54 »

Добрый день

Есть ф-ция (псевдокод)

Код
C++ (Qt)
bool UpdateEditValue(
  QLineEdit * edit,   // UI виджет
  FilterType filter,    // тип фильтра (напр UNSIGNED_FLOAT)
  float * value,        // модифицируемое значение
  float min, max, default,    // пределы  
  const QString & name );  // имя поля
 
Ф-ция возьмет значение из QLineEdit, выполнит все проверки, если все норм - запишет value, иначе вывалит сообщение об ошибке (поэтому нужен аргумент "name")

В принципе ф-ционал нормальный, но хотелось бы его расширить и сделать использование более компактным. Как это сделать ?

Спасибо

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июнь 08, 2020, 11:12 »

Код
C++ (Qt)
class IValidatorUpdater {/* place here basic public methods */}
 
bool UpdateEditValue(QLineEdit *edit, float *value, const QStrning &name, IValidatorUpdater *vu);
 
И дальше передавай класс с нужной фнукциональностью.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 08, 2020, 17:19 »

Код
C++ (Qt)
class IValidatorUpdater {/* place here basic public methods */}
 
bool UpdateEditValue(QLineEdit *edit, float *value, const QStrning &name, IValidatorUpdater *vu);
 
И дальше передавай класс с нужной фнукциональностью.
Хмм... ну и во что это вольется? Сейчас вызов выглядит
Код
C++ (Qt)
if (UpdateEditValue(edit, UNSIGNED_FLOAT, &data->mBias, 0.0f, 1.0f, 0.5f, "Bias")) ..
 
Терпимо, но длинновато (достаточно громоздко). Предлагается

Код
C++ (Qt)
MyUpdater updater(0.0f, 1.0f, 0.5f);
...
if (UpdateEditValue(edit, &data->mBias, "Bias", &updater)) ..
 
Возможно есть смысл хранить мапу <QLineEdit *, IValidatorUpdater *> в классе окна. Ну может и компактнее, но не особо. И ф-ционал IValidatorUpdater ограничен т.к. он не имеет указателя на данные и name.

На первый взгляд тут много заманчивых обобщений, но как-то "не ложится".

1) Почему только QLineEdit? Попапок и чекбоксов тоже хватает. Но тогда придется делать извлечение из виджета всяко-разно. Напр чекбокс может соответствовать (в данных) bool или int или битовому флагу

2) Почему конкретный "float"? Конечно есть и int и double и разнообразные enum'ы. Template напрашивается, но тогда опять возня с извлечением: toInt или toDouble или как?

3) Ну и подача адреса данных неприятно режет глаз. Нужен public, положили на геттеры/сеттеры. Но они ведь у каждого класса данных свои, как обобщать? Поэтому часто приходится вызовы UpdateEditValue оборачивать (геттером в локальную, если вернула true то сеттер)

Конечно все это можно пережить, но это неаккуратно. Как разложить все по полочкам?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Июнь 08, 2020, 17:35 »

1. Ты можешь написать свой класс FloatUpdater
2. Определи основной абстрактный интерфейс, чтобы туда можно было и QWidget* передавать, и name
3. Опиши основную логику в UpdateEditValue и остальное отдай на откуп валидатору
4. Напиши базовый валидатор с основной функциональностью.
Как-то так. Тут нужно отталкиваться от задачи, которая перед тобой стоит и от того, сколько всяких вариантов использования может быть. Я тебе дал направление, дальше думай сам.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 09, 2020, 10:10 »

1. Ты можешь написать свой класс FloatUpdater
2. Определи основной абстрактный интерфейс, чтобы туда можно было и QWidget* передавать, и name
3. Опиши основную логику в UpdateEditValue и остальное отдай на откуп валидатору
4. Напиши базовый валидатор с основной функциональностью.
Как-то так. Тут нужно отталкиваться от задачи, которая перед тобой стоит и от того, сколько всяких вариантов использования может быть. Я тебе дал направление, дальше думай сам.
Эти 1, 2, 3, 4 - это "or" или "and"? Т.е. их надо все реализовать или выбрать на свой вкус ? (как-то не очень ясно)

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


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