Russian Qt Forum
Ноябрь 27, 2024, 01:21
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Как отключить программную генерацию сигналов у виджетов ?
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как отключить программную генерацию сигналов у виджетов ? (Прочитано 9072 раз)
vanessa
Гость
Как отключить программную генерацию сигналов у виджетов ?
«
:
Январь 29, 2010, 15:10 »
поведение виджетов такое, что вызов метода setValue() приводит к тому что виджет генерирует сигнал valueChanged(). А можно как-то изменить это поведение так, чтоб вызов setValue() не приводил к генерации сигнала, а сигнал генерировался только тогда, когда пользователь подергал виджет ?
Записан
Amigo_sa
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #1 :
Январь 29, 2010, 15:23 »
У QObject есть полезная функция blockSignals(bool). Перед установкой значения нужно вызвать blockSignals(true), после - blockSignals(false);
Записан
vanessa
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #2 :
Январь 29, 2010, 15:24 »
функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ?
Записан
niXman
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #3 :
Январь 29, 2010, 16:36 »
а
QObject::disconnect()
не помогает?
Записан
Amigo_sa
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #4 :
Январь 29, 2010, 16:51 »
Цитата: vanessa от Январь 29, 2010, 15:24
функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ?
Кажется, нет. Для каждого Object-a нужно блокировать сигналы отдельно.
Записан
vanessa
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #5 :
Январь 29, 2010, 19:54 »
Цитата: niXman от Январь 29, 2010, 16:36
а
QObject::disconnect()
не помогает?
помогает, но нужно все отключать, а потом все включать. У меня например в окне 20 виджетов. как-то накладно все отключать, а потом все включать. Данные в них записывает один из методов родительского виджета все за раз, правда некоторые данные не меняются, но тогда и сигналы от соответствующих виджетов не посылаются. Можно конечно анализировать что изменилось и тогда блокировать или отключать индивидуально но как-то громоздко оно получается, я думал что может быть есть способ попроще.
Опишу задачу, может для таких целей есть что-то попроще. Приложение должно синхронизировать данные с другими своими копиями запущенными на разных компьютерах в сети. например, есть окно в котором QSpinBox отображает какое-то число, если кто-то изменит это число то оно дорожно изменится у всех. Еще есть программа-сервер, которая хранит это число и все другие периодически запрашивают нее данные. Я сейчас сделал примерно такой алгоритм что когда будет получен блок данных - записать их в соответствующие витжеты, а если какой-то виджет генерирует сигнал то тогда данные от него передаются на сервер. но вот тут то и есть проблема: если сервера пришли новые данные то это вызывает их передачу обратно на сервер поскольку вызов метода setValue() приводит к генерации сигнала valueChanged().
«
Последнее редактирование: Январь 29, 2010, 19:56 от vanessa
»
Записан
SABROG
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #6 :
Январь 29, 2010, 20:49 »
Используй сигнал void QAbstractSpinBox::editingFinished () [signal] для отправки данных на сервер.
Записан
mcrads
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #7 :
Март 05, 2010, 21:07 »
Цитата: Amigo_sa от Январь 29, 2010, 16:51
Цитата: vanessa от Январь 29, 2010, 15:24
функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ?
Кажется, нет. Для каждого Object-a нужно блокировать сигналы отдельно.
Можно, можно. есть такой метод parent(). например this->parent()->blockSignals() заблокирует сигналы родителя текущего объекта.
Записан
vanessa
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #8 :
Март 05, 2010, 23:03 »
Цитата: Sickfar от Март 05, 2010, 21:07
Цитата: Amigo_sa от Январь 29, 2010, 16:51
Цитата: vanessa от Январь 29, 2010, 15:24
функция полезная. а можно ее вызвать для родительского виджета, чтоб заблокировать посылку сигналов дочерними виджетами ?
Кажется, нет. Для каждого Object-a нужно блокировать сигналы отдельно.
Можно, можно. есть такой метод parent(). например this->parent()->blockSignals() заблокирует сигналы родителя текущего объекта.
А если нет родителя ? и в чем разница блокировать сигналы родителя или себя самого если их шлют дети ?
Записан
ритт
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #9 :
Март 06, 2010, 01:54 »
т.е. даже с понятием "state machine" мы не знакомы, да?
Записан
vanessa
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #10 :
Март 06, 2010, 10:05 »
Цитата: Константин от Март 06, 2010, 01:54
т.е. даже с понятием "state machine" мы не знакомы, да?
только в теории, но как это используется в QT - нет, не знаком.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #11 :
Март 06, 2010, 13:37 »
Цитата: vanessa от Январь 29, 2010, 15:10
поведение виджетов такое, что вызов метода setValue() приводит к тому что виджет генерирует сигнал valueChanged(). А можно как-то изменить это поведение так, чтоб вызов setValue() не приводил к генерации сигнала, а сигнал генерировался только тогда, когда пользователь подергал виджет ?
Блокирование/разблокирование сигналов возможно но часто получается сложно и запутано. Лучший способ указал
SABROG
- использовать сигналы которые испускаются при "вводе пользователя". Напр. для QLineEdit такой сигнал тоже есть.
Записан
SASA
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #12 :
Март 06, 2010, 13:59 »
Цитата: Константин от Март 06, 2010, 01:54
т.е. даже с понятием "state machine" мы не знакомы, да?
А это вы к чему?
Записан
ритт
Гость
Re: Как отключить программную генерацию сигналов у виджетов ?
«
Ответ #13 :
Март 07, 2010, 16:46 »
Цитата: SASA от Март 06, 2010, 13:59
Цитата: Константин от Март 06, 2010, 01:54
т.е. даже с понятием "state machine" мы не знакомы, да?
А это вы к чему?
ну, если бы даже SABROG ничего не подсказывал, документацию читать не умели и пр. - всё-равно здесь можно обойтись примитивной стэйтмашиной и не задавать таких детских вопросов.
по теме: SABROG уже ответил правильно. а впредь читайте документацию - документация хорошая...
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...