Название: Как отключить программную генерацию сигналов у виджетов ? Отправлено: vanessa от Январь 29, 2010, 15:10 поведение виджетов такое, что вызов метода setValue() приводит к тому что виджет генерирует сигнал valueChanged(). А можно как-то изменить это поведение так, чтоб вызов setValue() не приводил к генерации сигнала, а сигнал генерировался только тогда, когда пользователь подергал виджет ?
Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: Amigo_sa от Январь 29, 2010, 15:23 У QObject есть полезная функция blockSignals(bool). Перед установкой значения нужно вызвать blockSignals(true), после - blockSignals(false);
Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: vanessa от Январь 29, 2010, 15:24 функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ?
Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: niXman от Январь 29, 2010, 16:36 а QObject::disconnect() не помогает?
Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: Amigo_sa от Январь 29, 2010, 16:51 функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ? Кажется, нет. Для каждого Object-a нужно блокировать сигналы отдельно.Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: vanessa от Январь 29, 2010, 19:54 а QObject::disconnect() не помогает? помогает, но нужно все отключать, а потом все включать. У меня например в окне 20 виджетов. как-то накладно все отключать, а потом все включать. Данные в них записывает один из методов родительского виджета все за раз, правда некоторые данные не меняются, но тогда и сигналы от соответствующих виджетов не посылаются. Можно конечно анализировать что изменилось и тогда блокировать или отключать индивидуально но как-то громоздко оно получается, я думал что может быть есть способ попроще.Опишу задачу, может для таких целей есть что-то попроще. Приложение должно синхронизировать данные с другими своими копиями запущенными на разных компьютерах в сети. например, есть окно в котором QSpinBox отображает какое-то число, если кто-то изменит это число то оно дорожно изменится у всех. Еще есть программа-сервер, которая хранит это число и все другие периодически запрашивают нее данные. Я сейчас сделал примерно такой алгоритм что когда будет получен блок данных - записать их в соответствующие витжеты, а если какой-то виджет генерирует сигнал то тогда данные от него передаются на сервер. но вот тут то и есть проблема: если сервера пришли новые данные то это вызывает их передачу обратно на сервер поскольку вызов метода setValue() приводит к генерации сигнала valueChanged(). Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: SABROG от Январь 29, 2010, 20:49 Используй сигнал void QAbstractSpinBox::editingFinished () [signal] для отправки данных на сервер.
Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: mcrads от Март 05, 2010, 21:07 функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ? Кажется, нет. Для каждого Object-a нужно блокировать сигналы отдельно.Можно, можно. есть такой метод parent(). например this->parent()->blockSignals() заблокирует сигналы родителя текущего объекта. Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: vanessa от Март 05, 2010, 23:03 функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ? Кажется, нет. Для каждого Object-a нужно блокировать сигналы отдельно.Можно, можно. есть такой метод parent(). например this->parent()->blockSignals() заблокирует сигналы родителя текущего объекта. Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: ритт от Март 06, 2010, 01:54 т.е. даже с понятием "state machine" мы не знакомы, да? :)
Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: vanessa от Март 06, 2010, 10:05 т.е. даже с понятием "state machine" мы не знакомы, да? :) только в теории, но как это используется в QT - нет, не знаком.Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: Igors от Март 06, 2010, 13:37 поведение виджетов такое, что вызов метода setValue() приводит к тому что виджет генерирует сигнал valueChanged(). А можно как-то изменить это поведение так, чтоб вызов setValue() не приводил к генерации сигнала, а сигнал генерировался только тогда, когда пользователь подергал виджет ? Блокирование/разблокирование сигналов возможно но часто получается сложно и запутано. Лучший способ указал SABROG - использовать сигналы которые испускаются при "вводе пользователя". Напр. для QLineEdit такой сигнал тоже есть.Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: SASA от Март 06, 2010, 13:59 т.е. даже с понятием "state machine" мы не знакомы, да? :) А это вы к чему?Название: Re: Как отключить программную генерацию сигналов у виджетов ? Отправлено: ритт от Март 07, 2010, 16:46 т.е. даже с понятием "state machine" мы не знакомы, да? :) А это вы к чему?по теме: SABROG уже ответил правильно. а впредь читайте документацию - документация хорошая... |