在MATLAB中,如何在拖动滑块时执行回调函数?

10
我使用 GUIDE 创建了一个 MATLAB GUI。其中有一个带回调函数的滑块。我发现这个回调函数只有在滑块移动完毕且鼠标被释放后才执行,而不是在滑块移动时执行。
是否有方法使脚本在拖动滑块时运行,以实时更新图形?可能需要添加一些措施来防止脚本被运行太多次。
3个回答

16
即使在移动鼠标时没有调用滑块的回调函数,滑块UI控件的'Value'属性仍然会被更新。因此,您可以使用addlistener创建一个侦听器,在'Value'属性更改时执行给定的回调函数。以下是示例:
hSlider = uicontrol('Style', 'slider', 'Callback', @(s, e) disp('hello'));
hListener = addlistener(hSlider, 'Value', 'PostSet', @(s, e) disp('hi'));

当您移动滑块时,您应该看到屏幕上打印出'hi'(监听器回调),当您释放鼠标时,您将看到打印出'hello'(uicontrol回调)。

谢谢,这个例子基本上做了我想做的事情。不过我有一个问题,@(s, e)disp函数之前是做什么的?我猜测@创建了disphandle,但(s, e)是什么? - Bill Cheatham
2
@Bill: @(s,e) 创建了一个匿名函数,该函数将se作为输入参数并执行disp(...)。使用函数句柄作为回调函数需要函数至少接受两个参数,即使它们未被使用。这些参数是发出回调的对象的句柄(s)和它可选提供的事件数据(e)。更具描述性的名称可以是hObjecteventData,但我想简短些。 - gnovice

4

0

如果你想要执行传递给 uicontrol 的相同原始回调函数,你可以添加这个通用的监听器来引导现有的回调函数:

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

相关博客文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接