MATLAB Slider回调

时间:2015-04-15 14:43:11

标签: matlab matlab-guide

我使用GUIDE创建了一个MATLAB Gui。在该GUI中,我使用滑块来设置一些参数。我为滑块设置了一些合理的限制,但我希望用户能够增加超过该初始限制的值。 例如,默认情况下,滑块具有最小值1和最大值10.如果它位于10并且用户单击箭头以增加,我想将max的新值设置为11.

为了能够这样做,我想在滑块的回调函数中指定用户交互的类型。我想检查一下,用户是否单击了滑块上的增加按钮,如果是,如果滑块处于最大值,我想更改max属性。

有没有办法获取有关用户互动的信息?

我认识到,如果滑块已经是最大值,并且用户单击滑块的按钮以增加,则不会调用滑块的回调。似乎只有在实际移动滑块时才调用回调函数。所以我猜测滑块的不同按钮有单独的回调函数,我需要访问它们。

1 个答案:

答案 0 :(得分:2)

正如您自己发现的那样,当值已经达到最大值(或最小值)时,不会调用Matlab回调。

一种方法是检索滑块的java句柄,并对单击滑块按钮时将触发的事件进行操作,但这将是“未记录的”功能的一半,并且有机会(虽然在这种情况下很小)在将来的版本中不兼容。

解决问题的纯Matlab方法是使用滑块KeyPressedFcn中提供的其他事件。

例如,您可以决定使用鼠标操作只会在设置边界之间移动滑块值,但是在键盘上点击+-可能会覆盖最大值/最小值并重置它们更远一点。

这是在这个最小的例子中实现的。将下面的代码保存到单个slidertest.m文件中,然后运行它。尝试使用鼠标导航到最小/最大值,然后使用+-键并查看其工作原理。如果需要,您应该能够相对简单地实现更复杂的行为。

具有消耗边界的简单滑块:

slidertest

function h = slidertest

    h.f   = figure('Position',[200 200 500 150],'Menubar','none') ;
    h.sld = uicontrol('style','slider','position',[20 20 460 30],...
                    'Min',0 , 'Max',10 , 'SliderStep',[0.01 0.1] , 'Value', 1 , ...
                    'Tooltip','Use the `+` and `-` keys to override min and max boundaries') ;
    h.txt = uicontrol('style','text','position',[20 80 460 40],'String','1','Fontsize',20) ;

    set(h.sld,'Callback', {@sld_callback,h} )       %// set the Callback function for the slider
    set(h.sld,'KeyPressFcn', {@sld_KeyPressFcn,h} ) %// set the KeyPress function for the slider


function sld_callback(hobj,~,h)
    val = get(hobj,'Value') ;
    set( h.txt,'String', num2str(val) )
    %// put here whatever code has to be executed when you change the slider value


function sld_KeyPressFcn(hobj,evt,h)

    minval = get(hobj,'Min') ;
    maxval = get(hobj,'Max') ;
    val    = get(hobj,'Value') ;

    keyIncrement = 1 ; %// define that to what suits you

    switch evt.Character
        case '+'
            %// check if we have to increase the 'Max' before we change the value
            if (val+keyIncrement) > maxval
                set( hobj , 'Max' , maxval+keyIncrement ) ;
            end
            %// increment the value
            set( hobj , 'Value' , val+keyIncrement ) ;

        case '-'
            %// check if we have to decrease the 'Min' before we change the value
            if (val-keyIncrement) < minval
                set( hobj , 'Min' , minval-keyIncrement ) ;
            end
            %// decrement the value
            set( hobj , 'Value' , val-keyIncrement ) ;

        otherwise
            %// if you think about other cases ...
    end
    %// this is called just to update the display
    %// in your case it would insure whatever callback code you have for the
    %// slider is executed with the new value
    sld_callback(hobj,[],h)