Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: qtkoder777 от Июнь 26, 2017, 13:14



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


Название: Re: Как отключить сигнал-слот при программной (не ручной) установке значения
Отправлено: kuzulis от Июнь 26, 2017, 13:32
http://doc.qt.io/qt-5/qsignalblocker.html


Название: Re: Как отключить сигнал-слот при программной (не ручной) установке значения
Отправлено: qtkoder777 от Июнь 26, 2017, 14:02
Да тоже не очень каждый раз эт писать. Нельзя один раз на всю программу?


Название: Re: Как отключить сигнал-слот при программной (не ручной) установке значения
Отправлено: gil9red от Июнь 26, 2017, 14:12
Может быть, отнаследоваться от QSpinBox и переписать setValue чтобы он не отсылал сигнал?


Название: Re: Как отключить сигнал-слот при программной (не ручной) установке значения
Отправлено: Igors от Июнь 26, 2017, 15:50
Может быть, отнаследоваться от QSpinBox и переписать setValue чтобы он не отсылал сигнал?
Он не virtual, да хоть бы и был - в точке setValue неизвестно "от кого"

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


Название: Re: Как отключить сигнал-слот при программной (не ручной) установке значения
Отправлено: ssoft от Июнь 26, 2017, 16:23
Если метод вызван программно, то sender() вернет nullptr, если через сигнал, то адрес сигнализирующего объекта.

К сожалению, в Qt не предусмотрена возможность указать source начального сигнала, с помощью которого можно было бы контролировать зацикливание, рекурсию, гонки и др. неприятные моменты.