Russian Qt Forum

Qt => Общие вопросы => Тема начата: vanessa от Январь 29, 2010, 15:10



Название: Как отключить программную генерацию сигналов у виджетов ?
Отправлено: 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 ничего не подсказывал, документацию читать не умели и пр. - всё-равно здесь можно обойтись примитивной стэйтмашиной и не задавать таких детских вопросов.

по теме: SABROG уже ответил правильно. а впредь читайте документацию - документация хорошая...