【发布时间】:2011-05-17 15:07:05
【问题描述】:
我使用 GUIDE 创建了一个 MATLAB GUI。我有一个带有回调函数的滑块。我注意到这个回调,它应该在滑块移动时执行,实际上只有在滑块移动并释放鼠标后才会运行。
有没有办法让脚本在拖动滑块时运行,以实时更新情节?我认为需要一些东西来阻止脚本运行太多次。
【问题讨论】:
标签: user-interface matlab callback slider matlab-guide
我使用 GUIDE 创建了一个 MATLAB GUI。我有一个带有回调函数的滑块。我注意到这个回调,它应该在滑块移动时执行,实际上只有在滑块移动并释放鼠标后才会运行。
有没有办法让脚本在拖动滑块时运行,以实时更新情节?我认为需要一些东西来阻止脚本运行太多次。
【问题讨论】:
标签: user-interface matlab callback slider matlab-guide
即使在鼠标移动时没有调用滑块的回调,滑块 uicontrol 的'Value' property 也正在更新。因此,您可以使用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 函数之前做了什么?我猜@ 创建了要显示的句柄,但(s, e) 是什么?
@(s,e) 创建一个anonymous function,将s 和e 作为输入参数并执行disp(...)。使用function handles as callbacks 要求函数至少接受两个参数,即使它们没有被使用。这些参数是发出回调的对象的句柄 (s) 和它可选地提供的事件数据 (e)。更具描述性的名称将是 hObject 和 eventData,但我保持简短。
为了记录,这里详细讨论了这个主题:http://UndocumentedMatlab.com/blog/continuous-slider-callback/ - 那里提供了几种替代解决方案。 gnovice 使用addlistener 的解决方案等价于handle.listener alternative,因为addlistener 基本上只是后者的包装器。
【讨论】:
如果您想执行您传递给uicontrol 的相同原始回调,您可以添加这个引导现有回调的通用侦听器:
sld.addlistener('Value','PostSet',@(src,data) data.AffectedObject.Callback(data.AffectedObject,struct('Source',data.AffectedObject,'EventName','Action')));
【讨论】: