2011-05-17 14 views
10

He creado una GUI de MATLAB usando GUIDE. Tengo un control deslizante con una función de devolución de llamada. Me he dado cuenta de que esta devolución de llamada, que se supone que se ejecuta 'en el movimiento del control deslizante', de hecho solo se ejecuta una vez que se ha movido el deslizador y se ha soltado el mouse.En MATLAB, ¿cómo se puede ejecutar una devolución de llamada mientras se arrastra un control deslizante?

¿Hay alguna manera de ejecutar un script mientras se arrastra el control deslizante, para la actualización en vivo de un trazado? Supongo que es necesario que haya algo para evitar que el script se ejecute demasiadas veces.

Respuesta

16

Aunque no se está llamando a la devolución de llamada del control deslizante mientras se mueve el mouse, 'Value' property del control deslizante uicontrol está actualizando. Por lo tanto, puede crear un oyente usando addlistener que ejecutará una devolución de llamada dada cuando cambie la propiedad 'Value'. He aquí un ejemplo:

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

medida que mueva el control deslizante debería ver 'hi' está imprimiendo a la pantalla (la devolución de llamada oyente), y al soltar el ratón, verá 'hello' impreso (la devolución de llamada uicontrol).

+0

Gracias, este ejemplo básicamente hace lo que yo quiero hacer. Tengo una pregunta; ¿Qué hace el '@ (s, e)' antes de la función 'disp'? Supongo que '@' crea el identificador para disp, pero ¿cuál es el '(s, e)'? –

+2

@Bill: The '@ (s, e)' crea una [función anónima] (http://www.mathworks.com/help/techdoc/matlab_prog/f4-70115.html) que toma como argumentos de entrada 's' y 'e' y ejecuta' disp (...) '. El uso de [identificadores de funciones como devoluciones de llamada] (http://www.mathworks.com/help/techdoc/creating_guis/f16-999606.html#f16-1001315) requiere que la función acepte al menos dos argumentos, incluso si no son usado. Estos argumentos son el manejador del objeto que emite la devolución de llamada ('s') y los datos de evento que proporciona opcionalmente (' e'). Los nombres más descriptivos serían 'hObject' y' eventData', pero me mantenía corto. – gnovice

4

Solo para el registro, este tema se trata en detalle aquí: http://UndocumentedMatlab.com/blog/continuous-slider-callback/ - varias soluciones alternativas se presentan allí. La solución de gnovice que usa addlistener es equivalente al handle.listener alternative, ya que addlistener es básicamente una envoltura para este último.

0

Si desea ejecutar la misma devolución de llamada original, que pasó a uicontrol puede agregar a este detector genérico que Bootstraps la devolución de llamada existente:

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

Related blog post

Cuestiones relacionadas