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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отключить сигнал-слот при программной (не ручной) установке значения  (Прочитано 7433 раз)
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« : Июнь 26, 2017, 13:14 »

При вводе пользователем значений в некоторые поля QSpinBox надо менять значения в других полях.
При программной установке срабатывают слоты, предназначенные для обработки ввода пользователем, что нежелательно, так как может вызвать рекурсивный вызов слотов.
Как от этого избавиться, не оборачивая каждую программную установку значения в blockSignals?
Код
C++ (Qt)
blockSignals(true);
spinbox->setValue(v);
blockSignals(false);
Некрасиво и многословно. Можно ли сделать лучше?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Июнь 26, 2017, 13:32 »

http://doc.qt.io/qt-5/qsignalblocker.html
Записан

ArchLinux x86_64 / Win10 64 bit
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #2 : Июнь 26, 2017, 14:02 »

Да тоже не очень каждый раз эт писать. Нельзя один раз на всю программу?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Июнь 26, 2017, 14:12 »

Может быть, отнаследоваться от QSpinBox и переписать setValue чтобы он не отсылал сигнал?
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 26, 2017, 15:50 »

Может быть, отнаследоваться от QSpinBox и переписать setValue чтобы он не отсылал сигнал?
Он не virtual, да хоть бы и был - в точке setValue неизвестно "от кого"

Недавно создавал подобную тему, хорошего решения не видно. А с блокировками да, мучения
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #5 : Июнь 26, 2017, 16:23 »

Если метод вызван программно, то sender() вернет nullptr, если через сигнал, то адрес сигнализирующего объекта.

К сожалению, в Qt не предусмотрена возможность указать source начального сигнала, с помощью которого можно было бы контролировать зацикливание, рекурсию, гонки и др. неприятные моменты.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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