crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Обработчик изменений на всей форме
pers_tmb
  опции профиля:
сообщение 7.6.2012, 15:52
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 7.6.2012
Пользователь №: 3416

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток :)

Я с программированием и с QT в частности пока ещё на Вы, но писать кучу лишнего кода уже лень.
Вообщем по нажатию на одну из кнопок создаётся у меня диалог с кучей полей QLineEdit. Хочется сделать так, чтобы на кнопку OK, привязанную к слоту accept(), можно было нажать только когда все поля заполнены. Сейчас я могу реализовать это только через сигнал textChanged для каждого поля по отдельности.

Но наверняка существует какая-нибудь хитрость, упрощающая задачу... :rolleyes: Подскажите, пожалуйста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 7.6.2012, 23:03
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Думаю, такой хитрости нет((( А что первоначальный вариант занимает много места?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 8.6.2012, 6:47
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


так энто самое... Заведи сигнал изменения текста со всех контролов в один слот, где будет производится проверка ВСЕХ контролов, а затем обновление статуса кнопки (доступна/недоступна). При инициализации формы слот нужно будет вызвать один раз вручную.

Поскольку по крайней мере два раза необходима групповая обработка контролов, имеет смысл хранить указатели на все эти контролы в массиве - члене класса (вектор, к примеру)

Сообщение отредактировал Алексей1153 - 8.6.2012, 6:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 10.6.2012, 13:34
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Можно написать универсальный класс-обработчик изменения состояний контролов (не только QLineEdit). В конструкторе формы создаётся обработчик, там ему указываются контролы (каким-нибудь перегруженным addWidget()), которые надо проверять при изменении. Для каждого типа виждета существует определённый сигнал, по которому можно узнать об изменении данных в контроле (соответственно, в методе addWidget() привязать сигнал к конкретному слоту, который будет испускать сигнал с булевым значением - признак заполнености контролов). После инициализации контролов и настройки объекта-обработчика, необходимо будет вызвать некую функцию инициализации начального состояния (проверка заполнености контролов). Соответственно, также надо будет соединить сигнал, испускаемый обработчиком, с необходимым слотом (слот изменения доступности кнопки, например).
Также можно для кастомных контролов шаблонный addWidget() сделать, который будет принимать указатель на контрол, сигнатуру сигнала, испускаемого при изменении данных контола, и название метода класса, вызываемого для проверки (или указатель на функцию проверки состояния контрола).
Ещё можно ввести "режимы работы" обработчика (задавать при конструировании объекта):
1. проверка сразу, при изменении данных в контроле (как описано выше);
2. проверка при вызове функции (возвращает признак). Здесь можно незаполненные контролы обводить красной рамкой или выводить сообщения в модальном диалоге о незаполнености конкретных полей (тогда в addWidget() передавать текст с сообщением).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 12.6.2012, 11:02
Сообщение #5





Гости








    


А можно не заморачиваться, использовать MVC, и ловить dataChanged у модели.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.1.2025, 1:56