Как в MATLAB выполнить обратный вызов при перетаскивании ползунка?

Я создал графический интерфейс MATLAB, используя GUIDE. У меня есть слайдер с функцией обратного вызова. Я заметил, что этот обратный вызов, который должен выполняться «при перемещении ползунка», на самом деле запускается только после перемещения ползунка и отпускания мыши.

Есть ли способ запустить скрипт при перетаскивании ползунка для обновления графика в реальном времени? Я предполагаю, что должно быть что-то, чтобы остановить запуск сценария слишком много раз.


person Bill Cheatham    schedule 17.05.2011    source источник


Ответы (3)


Несмотря на то, что обратный вызов ползунка не вызывается при перемещении мыши, 'Value' свойство ползунка uicontrol обновляется. Таким образом, вы можете создать прослушиватель, используя addlistener, который будет выполнять заданный обратный вызов при изменении свойства 'Value'. Вот пример:

hSlider = uicontrol('Style', 'slider', 'Callback', @(s, e) disp('hello'));
hListener = addlistener(hSlider, 'Value', 'PostSet', @(s, e) disp('hi'));

Когда вы перемещаете ползунок, вы должны видеть, что 'hi' выводится на экран (обратный вызов слушателя), а когда вы отпускаете кнопку мыши, вы видите 'hello' (обратный вызов uicontrol).

person gnovice    schedule 17.05.2011
comment
Спасибо, этот пример в основном делает то, что я хочу сделать. У меня есть один вопрос; что делает @(s, e) перед функцией disp? Я предполагаю, что @ создает дескриптор для отображения, но что такое (s, e)? - person Bill Cheatham; 18.05.2011
comment
@Bill: @(s,e) создает анонимную функцию, которая принимает входные аргументы s и e и выполняет disp(...). Использование функциональных дескрипторов в качестве обратных вызовов требует, чтобы функция принимает как минимум два аргумента, даже если они не используются. Эти аргументы представляют собой дескриптор объекта, выдающего обратный вызов (s), и данные события, которые он дополнительно предоставляет (e). Более информативными именами были бы hObject и eventData, но я был краток. - person gnovice; 18.05.2011

Для справки: эта тема подробно обсуждается здесь: http://UndocumentedMatlab.com/blog/continuous-slider-callback/ — там представлены несколько альтернативных решений. Решение gnovice с использованием addlistener эквивалентно handle.listener alternative, так как addlistener в основном является просто оболочкой для последнего.

person Yair Altman    schedule 15.06.2011

Если вы хотите выполнить тот же исходный обратный вызов, который вы передали uicontrol, вы можете добавить этот общий слушатель, который загружает существующий обратный вызов:

sld.addlistener('Value','PostSet',@(src,data) data.AffectedObject.Callback(data.AffectedObject,struct('Source',data.AffectedObject,'EventName','Action')));

Похожая запись в блоге

person Alec Jacobson    schedule 15.10.2014