Обработчик изменений на всей форме |
Здравствуйте, гость ( Вход | Регистрация )
Обработчик изменений на всей форме |
pers_tmb |
7.6.2012, 15:52
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 1 Регистрация: 7.6.2012 Пользователь №: 3416 Спасибо сказали: 0 раз(а) Репутация: 0 |
Доброго времени суток
Я с программированием и с QT в частности пока ещё на Вы, но писать кучу лишнего кода уже лень. Вообщем по нажатию на одну из кнопок создаётся у меня диалог с кучей полей QLineEdit. Хочется сделать так, чтобы на кнопку OK, привязанную к слоту accept(), можно было нажать только когда все поля заполнены. Сейчас я могу реализовать это только через сигнал textChanged для каждого поля по отдельности. Но наверняка существует какая-нибудь хитрость, упрощающая задачу... Подскажите, пожалуйста. |
|
|
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 у модели.
|
|
|
Текстовая версия | Сейчас: 25.1.2025, 1:56 |