Russian Qt Forum

Qt => Вопросы новичков => Тема начата: 861401 от Февраль 10, 2012, 02:00



Название: QValidator & QLineEdit
Отправлено: 861401 от Февраль 10, 2012, 02:00
Здраствуйте :)
Заранее скажу, что я новичок в программировании и пользуюсь Qt Creator (много где читал, что для создания графического интерфейса он проще всего, но суть топика не в этом  :) )
Ситуация такая: у меня есть несколько LineEdit'ов, в которые нужно запретить ввод всех символов, кроме чисел. Погуглив документацию и другие форумы я пришёл к такому решению

Код:
ui->lineEdit_R1->setValidator(new QDoubleValidator(-999.0,999.0, 2, this));

Проблема заключается в том, что LineEdit'ов мне придётся создать ещё по меньшей мере штук 60. И прописывать для каждого валидатор мне кажется неразумным. Может можно как-нибудь установить валидатор для всех создаваемых объектов класса QLineEdit? Или может ещё какое-нибудь решение есть?


Название: Re: QValidator & QLineEdit
Отправлено: kambala от Февраль 10, 2012, 05:39
надо унаследоваться от QLineEdit и в конструкторе установить валидатор - тогда все объекты нового типа сразу будут иметь встроенный валидатор.
Код
C++ (Qt)
class ValidatableLineEdit : public QLineEdit
{
public:
   ValidatableLineEdit(QWidget *parent = 0) : QLineEdit(parent)
   {
       setValidator(new QDoubleValidator(-999.0, 999.0, 2, this));
   }
};
по желанию можно добавить параметры минимума, максимума, шага в конструктор и/или через сеттеры/геттеры, если у лайнэдитов могут быть разные допустимые границы.

теперь в коде нужно создавать объекты типа ValidatableLineEdit вместо QLineEdit, а в дизайнере надо преобразовать существующие лайнэдиты в этот новый класс (правой кнопкной на лайнэдит - promote to/преобразовать в).


Название: Re: QValidator & QLineEdit
Отправлено: 861401 от Февраль 10, 2012, 13:22
kambala, спасибо большое, как раз то что надо  :)


Название: Re: QValidator & QLineEdit
Отправлено: andrew.k от Февраль 10, 2012, 17:06
Мне кажется ради этого не стоит делать новый класс.
почему в цикле не задать валидатор? Я так понимаю, там штабеля лайнэдитов.


Название: Re: QValidator & QLineEdit
Отправлено: kambala от Февраль 10, 2012, 17:17
для цикла лайнэдиты ещё придётся в контейнер помещать (копипастная работа), а .ui файл можно в блокноте переправить одной заменой


Название: Re: QValidator & QLineEdit
Отправлено: andrew.k от Февраль 10, 2012, 17:54
для цикла лайнэдиты ещё придётся в контейнер помещать (копипастная работа), а .ui файл можно в блокноте переправить одной заменой
Ну вообще да. Согласен.


Название: Re: QValidator & QLineEdit
Отправлено: Igors от Февраль 10, 2012, 18:20
Позвольте, а где же следование принципам ООП? Разве установка диапазона создает "новую сущность" и QLineEdit становится уже чем-то иным? :)

861401 - не воспринимайте это слишком серьезно, предложенное решение вполне нормальное. Вообще какой-то мап (или просто ассоциативный массив) возникают часто. Сегодня видел похожую тему. Если уж "докапываться" то причина в использовании указателей. Автоматизация таких рутинных вещей становится легче если окно умеет выдернуть контрол по ID (номеру). Тогда легко расписать массивчик "ID - диапазон". Ну это если есть желание (и необходимость) копать - а пока нормально и в конструктор добавить.


Название: Re: QValidator & QLineEdit
Отправлено: BRE от Февраль 10, 2012, 18:27
Позвольте, а где же следование принципам ООП? Разве установка диапазона создает "новую сущность" и QLineEdit становится уже чем-то иным? :)
Сущности выделяются для каждой конкретной задачи и в данном случае да, можно считать что QLineEdit становится чем-то другим, а именно NumEdit, например.
Была стока для ввода чего попало - стала строкой для ввода чисел в заданном диапазоне.



Название: Re: QValidator & QLineEdit
Отправлено: iroln от Февраль 10, 2012, 18:55
Надо использовать QDoubleSpinBox вместо QLineEdit+QDoubleValidator, вот и всё. Но это, конечно, не прокатит, если надо вводить, скажем, списки значений через пробел. Хотя разве QDoubleValidator разрешает пробелы?


Название: Re: QValidator & QLineEdit
Отправлено: 861401 от Февраль 11, 2012, 03:28
Надо использовать QDoubleSpinBox вместо QLineEdit+QDoubleValidator, вот и всё. Но это, конечно, не прокатит, если надо вводить, скажем, списки значений через пробел. Хотя разве QDoubleValidator разрешает пробелы?
QDoubleValidator не даёт вводить пробелы. А про QDoubleSpinBox я не знал, с ним действительно проще. Но зато я узнал для чего надо Promote to  :)