如何使用 Matlab GUI 滑块槽
How To Use Matlab GUI Slider Trough
我正在尝试浏览加载到 GUI 中的图像。当图像加载到 GUI 中时,我像这样更新了滑块参数。
部分"function"用于图片加载
if handles.nImages > 1
set(handles.frameSlider,'Min',1,'Max',handles.nImages,'Value',1)
handles.sliderStep = [1 1]/(handles.nImages - 1);
set(handles.frameSlider,'SliderStep',handles.sliderStep)
end
然后尝试在图像中滑动,滑块箭头键工作正常,但当我这样做时,拉动滑块槽不起作用。当我拉动滑槽时,拉动很顺畅,没有任何阶跃感。它给我这个错误:Subscript indices must either be real positive integers or logicals
。我认为发生这种情况是因为当我拉动槽时,我将其设置在允许的滑块增量之间的 values
,因为拉动不是逐步增加的。
部分"function"用于拉动滑块
sliderPosition = get(handles.frameSlider,'Value');
imagesc(handles.imageListPhs{indexes})
可能是什么错误?
滑块的步长仅决定当用户单击箭头按钮或在滑块槽内时它的行为方式。用户拖动时拇指的位置不受步长控制,因此它很可能 return 是一个非整数,不能用作索引。您将需要使用舍入函数,例如 round
, ceil
, floor
, or fix
将滑块值转换为对索引有效的值。
考虑以下示例:
function testcode
nA = 15;
myfig = figure('MenuBar', 'none', 'ToolBar', 'none', 'NumberTitle', 'off');
lbl(1) = uicontrol('Parent', myfig, 'Style', 'text', ...
'Units', 'Normalized', 'Position', [0.1 0.7 0.8 0.2], ...
'FontSize', 24, 'String', 'Selected Value:');
lbl(2) = uicontrol('Parent', myfig, 'Style', 'text', ...
'Units', 'Normalized', 'Position', [0.1 0.4 0.8 0.2], ...
'FontSize', 24, 'String', 'Rounded Value:');
uicontrol('Parent', myfig, 'Style', 'Slider', ...
'Units', 'Normalized', 'Position', [0.1 0.1 0.8 0.2], ...
'Min', 1, 'Max', nA, 'SliderStep', [1 1]/(nA - 1), 'Value', 1, ...
'Callback', {@clbk, lbl});
end
function clbk(hObject, ~, lbl)
slider_value = get(hObject, 'Value');
slider_value_rnd = round(slider_value);
set(lbl(1), 'String', sprintf('Selected Value: %.2f\n Can I Index with this? %s', ...
slider_value, canIindexwiththis(slider_value)));
set(lbl(2), 'String', sprintf('Rounded Value: %.2f\n Can I Index with this? %s', ...
slider_value_rnd, canIindexwiththis(slider_value_rnd)));
set(hObject, 'Value', slider_value_rnd); % Snap slider to correct position
end
function [yesno] = canIindexwiththis(val)
try
A(val) = 0;
catch
yesno = 'No!';
return
end
yesno = 'Yes!';
end
说明了这个过程:
我正在尝试浏览加载到 GUI 中的图像。当图像加载到 GUI 中时,我像这样更新了滑块参数。
部分"function"用于图片加载
if handles.nImages > 1
set(handles.frameSlider,'Min',1,'Max',handles.nImages,'Value',1)
handles.sliderStep = [1 1]/(handles.nImages - 1);
set(handles.frameSlider,'SliderStep',handles.sliderStep)
end
然后尝试在图像中滑动,滑块箭头键工作正常,但当我这样做时,拉动滑块槽不起作用。当我拉动滑槽时,拉动很顺畅,没有任何阶跃感。它给我这个错误:Subscript indices must either be real positive integers or logicals
。我认为发生这种情况是因为当我拉动槽时,我将其设置在允许的滑块增量之间的 values
,因为拉动不是逐步增加的。
部分"function"用于拉动滑块
sliderPosition = get(handles.frameSlider,'Value');
imagesc(handles.imageListPhs{indexes})
可能是什么错误?
滑块的步长仅决定当用户单击箭头按钮或在滑块槽内时它的行为方式。用户拖动时拇指的位置不受步长控制,因此它很可能 return 是一个非整数,不能用作索引。您将需要使用舍入函数,例如 round
, ceil
, floor
, or fix
将滑块值转换为对索引有效的值。
考虑以下示例:
function testcode
nA = 15;
myfig = figure('MenuBar', 'none', 'ToolBar', 'none', 'NumberTitle', 'off');
lbl(1) = uicontrol('Parent', myfig, 'Style', 'text', ...
'Units', 'Normalized', 'Position', [0.1 0.7 0.8 0.2], ...
'FontSize', 24, 'String', 'Selected Value:');
lbl(2) = uicontrol('Parent', myfig, 'Style', 'text', ...
'Units', 'Normalized', 'Position', [0.1 0.4 0.8 0.2], ...
'FontSize', 24, 'String', 'Rounded Value:');
uicontrol('Parent', myfig, 'Style', 'Slider', ...
'Units', 'Normalized', 'Position', [0.1 0.1 0.8 0.2], ...
'Min', 1, 'Max', nA, 'SliderStep', [1 1]/(nA - 1), 'Value', 1, ...
'Callback', {@clbk, lbl});
end
function clbk(hObject, ~, lbl)
slider_value = get(hObject, 'Value');
slider_value_rnd = round(slider_value);
set(lbl(1), 'String', sprintf('Selected Value: %.2f\n Can I Index with this? %s', ...
slider_value, canIindexwiththis(slider_value)));
set(lbl(2), 'String', sprintf('Rounded Value: %.2f\n Can I Index with this? %s', ...
slider_value_rnd, canIindexwiththis(slider_value_rnd)));
set(hObject, 'Value', slider_value_rnd); % Snap slider to correct position
end
function [yesno] = canIindexwiththis(val)
try
A(val) = 0;
catch
yesno = 'No!';
return
end
yesno = 'Yes!';
end
说明了这个过程: