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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QValidator & QLineEdit  (Прочитано 9780 раз)
861401
Гость
« : Февраль 10, 2012, 02:00 »

Здраствуйте Улыбающийся
Заранее скажу, что я новичок в программировании и пользуюсь Qt Creator (много где читал, что для создания графического интерфейса он проще всего, но суть топика не в этом  Улыбающийся )
Ситуация такая: у меня есть несколько LineEdit'ов, в которые нужно запретить ввод всех символов, кроме чисел. Погуглив документацию и другие форумы я пришёл к такому решению

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

Проблема заключается в том, что LineEdit'ов мне придётся создать ещё по меньшей мере штук 60. И прописывать для каждого валидатор мне кажется неразумным. Может можно как-нибудь установить валидатор для всех создаваемых объектов класса QLineEdit? Или может ещё какое-нибудь решение есть?
« Последнее редактирование: Февраль 10, 2012, 02:04 от 861401 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Февраль 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/преобразовать в).
Записан

Изучением 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
861401
Гость
« Ответ #2 : Февраль 10, 2012, 13:22 »

kambala, спасибо большое, как раз то что надо  Улыбающийся
Записан
andrew.k
Гость
« Ответ #3 : Февраль 10, 2012, 17:06 »

Мне кажется ради этого не стоит делать новый класс.
почему в цикле не задать валидатор? Я так понимаю, там штабеля лайнэдитов.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Февраль 10, 2012, 17:17 »

для цикла лайнэдиты ещё придётся в контейнер помещать (копипастная работа), а .ui файл можно в блокноте переправить одной заменой
Записан

Изучением 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
andrew.k
Гость
« Ответ #5 : Февраль 10, 2012, 17:54 »

для цикла лайнэдиты ещё придётся в контейнер помещать (копипастная работа), а .ui файл можно в блокноте переправить одной заменой
Ну вообще да. Согласен.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 10, 2012, 18:20 »

Позвольте, а где же следование принципам ООП? Разве установка диапазона создает "новую сущность" и QLineEdit становится уже чем-то иным? Улыбающийся

861401 - не воспринимайте это слишком серьезно, предложенное решение вполне нормальное. Вообще какой-то мап (или просто ассоциативный массив) возникают часто. Сегодня видел похожую тему. Если уж "докапываться" то причина в использовании указателей. Автоматизация таких рутинных вещей становится легче если окно умеет выдернуть контрол по ID (номеру). Тогда легко расписать массивчик "ID - диапазон". Ну это если есть желание (и необходимость) копать - а пока нормально и в конструктор добавить.
Записан
BRE
Гость
« Ответ #7 : Февраль 10, 2012, 18:27 »

Позвольте, а где же следование принципам ООП? Разве установка диапазона создает "новую сущность" и QLineEdit становится уже чем-то иным? Улыбающийся
Сущности выделяются для каждой конкретной задачи и в данном случае да, можно считать что QLineEdit становится чем-то другим, а именно NumEdit, например.
Была стока для ввода чего попало - стала строкой для ввода чисел в заданном диапазоне.

Записан
iroln
Гость
« Ответ #8 : Февраль 10, 2012, 18:55 »

Надо использовать QDoubleSpinBox вместо QLineEdit+QDoubleValidator, вот и всё. Но это, конечно, не прокатит, если надо вводить, скажем, списки значений через пробел. Хотя разве QDoubleValidator разрешает пробелы?
« Последнее редактирование: Февраль 10, 2012, 19:00 от iroln » Записан
861401
Гость
« Ответ #9 : Февраль 11, 2012, 03:28 »

Надо использовать QDoubleSpinBox вместо QLineEdit+QDoubleValidator, вот и всё. Но это, конечно, не прокатит, если надо вводить, скажем, списки значений через пробел. Хотя разве QDoubleValidator разрешает пробелы?
QDoubleValidator не даёт вводить пробелы. А про QDoubleSpinBox я не знал, с ним действительно проще. Но зато я узнал для чего надо Promote to  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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