【问题标题】:In MATLAB, how can you have a callback execute while a slider is being dragged?在 MATLAB 中,如何在拖动滑块时执行回调?
【发布时间】:2011-05-17 15:07:05
【问题描述】:

我使用 GUIDE 创建了一个 MATLAB GUI。我有一个带有回调函数的滑块。我注意到这个回调,它应该在滑块移动时执行,实际上只有在滑块移动并释放鼠标后才会运行。

有没有办法让脚本在拖动滑块时运行,以实时更新情节?我认为需要一些东西来阻止脚本运行太多次。

【问题讨论】:

    标签: user-interface matlab callback slider matlab-guide


    【解决方案1】:

    即使在鼠标移动时没有调用滑块的回调,滑块 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) 是什么?
    • @Bill:@(s,e) 创建一个anonymous function,将se 作为输入参数并执行disp(...)。使用function handles as callbacks 要求函数至少接受两个参数,即使它们没有被使用。这些参数是发出回调的对象的句柄 (s) 和它可选地提供的事件数据 (e)。更具描述性的名称将是 hObjecteventData,但我保持简短。
    【解决方案2】:

    为了记录,这里详细讨论了这个主题:http://UndocumentedMatlab.com/blog/continuous-slider-callback/ - 那里提供了几种替代解决方案。 gnovice 使用addlistener 的解决方案等价于handle.listener alternative,因为addlistener 基本上只是后者的包装器。

    【讨论】:

      【解决方案3】:

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

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

      Related blog post

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        • 1970-01-01
        • 2016-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多