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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отключить программную генерацию сигналов у виджетов ?  (Прочитано 9079 раз)
vanessa
Гость
« : Январь 29, 2010, 15:10 »

поведение виджетов такое, что  вызов метода setValue() приводит к тому что виджет генерирует сигнал valueChanged(). А можно как-то изменить это поведение так, чтоб вызов setValue() не приводил к генерации сигнала, а сигнал генерировался только тогда, когда пользователь подергал виджет ?
Записан
Amigo_sa
Гость
« Ответ #1 : Январь 29, 2010, 15:23 »

У QObject есть полезная функция blockSignals(bool). Перед установкой значения нужно вызвать blockSignals(true), после - blockSignals(false);
Записан
vanessa
Гость
« Ответ #2 : Январь 29, 2010, 15:24 »

функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ?
Записан
niXman
Гость
« Ответ #3 : Январь 29, 2010, 16:36 »

а QObject::disconnect() не помогает?
Записан
Amigo_sa
Гость
« Ответ #4 : Январь 29, 2010, 16:51 »

функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ?
Кажется, нет. Для каждого Object-a нужно блокировать сигналы отдельно.
Записан
vanessa
Гость
« Ответ #5 : Январь 29, 2010, 19:54 »

а QObject::disconnect() не помогает?
помогает, но нужно все отключать, а потом все включать. У меня например в окне 20 виджетов. как-то накладно все отключать, а потом все включать. Данные в  них записывает один из методов родительского виджета все за раз, правда некоторые данные не меняются, но тогда и сигналы от соответствующих виджетов не посылаются. Можно конечно анализировать что изменилось и тогда блокировать или отключать индивидуально но как-то громоздко оно получается, я думал что может быть есть способ попроще.

Опишу задачу, может для таких целей есть что-то попроще. Приложение должно синхронизировать данные с другими своими копиями запущенными на разных компьютерах в сети. например, есть окно в котором QSpinBox отображает какое-то число, если кто-то изменит это число то оно дорожно изменится у всех. Еще есть программа-сервер, которая хранит это число и все другие периодически запрашивают нее данные. Я сейчас сделал примерно такой алгоритм что когда будет получен блок данных - записать их в соответствующие витжеты, а если какой-то виджет генерирует сигнал то тогда данные от него передаются на сервер. но вот тут то и есть проблема: если сервера пришли новые данные то это вызывает их передачу обратно на сервер поскольку вызов метода setValue() приводит к генерации сигнала valueChanged().
« Последнее редактирование: Январь 29, 2010, 19:56 от vanessa » Записан
SABROG
Гость
« Ответ #6 : Январь 29, 2010, 20:49 »

Используй сигнал void QAbstractSpinBox::editingFinished ()   [signal] для отправки данных на сервер.
Записан
mcrads
Гость
« Ответ #7 : Март 05, 2010, 21:07 »

функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ?
Кажется, нет. Для каждого Object-a нужно блокировать сигналы отдельно.

Можно, можно. есть такой метод parent(). например this->parent()->blockSignals() заблокирует сигналы родителя текущего объекта.
Записан
vanessa
Гость
« Ответ #8 : Март 05, 2010, 23:03 »

функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ?
Кажется, нет. Для каждого Object-a нужно блокировать сигналы отдельно.

Можно, можно. есть такой метод parent(). например this->parent()->blockSignals() заблокирует сигналы родителя текущего объекта.
А если нет родителя ? и в чем разница блокировать сигналы родителя или себя самого если их шлют дети ?
Записан
ритт
Гость
« Ответ #9 : Март 06, 2010, 01:54 »

т.е. даже с понятием "state machine" мы не знакомы, да? Улыбающийся
Записан
vanessa
Гость
« Ответ #10 : Март 06, 2010, 10:05 »

т.е. даже с понятием "state machine" мы не знакомы, да? Улыбающийся
только в теории, но как это используется в QT - нет, не знаком.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 06, 2010, 13:37 »

поведение виджетов такое, что  вызов метода setValue() приводит к тому что виджет генерирует сигнал valueChanged(). А можно как-то изменить это поведение так, чтоб вызов setValue() не приводил к генерации сигнала, а сигнал генерировался только тогда, когда пользователь подергал виджет ?
Блокирование/разблокирование сигналов возможно но часто получается сложно и запутано. Лучший способ указал SABROG - использовать сигналы которые испускаются при "вводе пользователя". Напр. для QLineEdit такой сигнал тоже есть.
Записан
SASA
Гость
« Ответ #12 : Март 06, 2010, 13:59 »

т.е. даже с понятием "state machine" мы не знакомы, да? Улыбающийся
А это вы к чему?
Записан
ритт
Гость
« Ответ #13 : Март 07, 2010, 16:46 »

т.е. даже с понятием "state machine" мы не знакомы, да? Улыбающийся
А это вы к чему?
ну, если бы даже SABROG ничего не подсказывал, документацию читать не умели и пр. - всё-равно здесь можно обойтись примитивной стэйтмашиной и не задавать таких детских вопросов.

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


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