uicontrol回调多个函数

时间:2015-12-09 05:25:30

标签: matlab matlab-gui

我想用 uicontrol Matlab 上编写一个GUI程序并在其上制作3个滑块,然后编写回调 s在一个命令中使用它们的3个值。我找到了一种为一个滑块编写函数的方法,就像我在程序中看到的那样。你能帮我看看如何使用这3个回调吗? (我使用R2014a)

sld = uicontrol('Style', 'slider',...
    'Min',0,'Max',255,'Value',0,...
    'Position', [400 20 120 20],...
    'Callback', @Blue); 
sld = uicontrol('Style', 'slider',...
    'Min',0,'Max',255,'Value',0,...
    'Position', [400 60 120 20],...
    'Callback', @Green); 
sld = uicontrol('Style', 'slider',...
    'Min',0,'Max',255,'Value',255,...
    'Position', [400 100 120 20],...
    'Callback', @Red);
function Red(source,~)

     R = get(source,'Value');

end
function Green(source,~)

     G = get(source,'Value');

end
function Blue(source,~)

     B =  get(source,'Value');

end
RGB = cat(3,R,G,B); %??????
Error: Undefined function or variable "R".

2 个答案:

答案 0 :(得分:0)

持久性数据必须存储在回调函数可访问的某个位置。一种常见的技术是use the parent figure's UserData field。在上面的示例中,移动滑块后,可以在图RGB' fh的{​​{1}}字段中找到当前颜色。此外,此处仅使用一个回调,并且通过其UserData来识别UI项目。

Tag

答案 1 :(得分:0)

或者,您可以只存储图形对象的句柄,并使用它们来获取其他函数中的值。

例如:

function testcode
% Initialize sample GUI
h.fig = figure( 'MenuBar', 'none', 'ToolBar', 'none');
h.sld(1) = uicontrol( ...
    'Parent', h.fig, ...
    'Style', 'slider',...
    'Min', 0, 'Max', 255, 'Value', 0, ...
    'Units', 'Normalized', 'Position', [0.1 0.65 0.4 0.1], ...
    'Tag', 'Red' ...
    );
h.sld(2) = uicontrol( ...
    'Parent', h.fig, ...
    'Style', 'slider', ...
    'Min', 0, 'Max', 255, 'Value', 0, ...
    'Units', 'Normalized', 'Position', [0.1 0.45 0.4 0.1], ...
    'Tag', 'Green' ...
    );
h.sld(3) = uicontrol( ...
    'Parent', h.fig, ...
    'Style', 'slider', ...
    'Min', 0, 'Max', 255, 'Value', 255, ...
    'Units', 'Normalized', 'Position', [0.1 0.25 0.4 0.1], ...
    'Tag', 'Blue' ...
    );

% Use an axes object as a color display box
% Get starting RGB values for the color display, normalized so 0 <= x <= 1
startRGB = [get(h.sld(1), 'Value'), get(h.sld(2), 'Value'), get(h.sld(3), 'Value')]/255;

h.ax = axes( ...
    'Parent', h.fig, ...
    'Units', 'Normalized', 'Position', [0.6 0.36 0.3 0.3], ...
    'XTickLabels', '', 'YTickLabels', '', ...
    'Color', startRGB ...
    );

% Need to set callback after all our elements are initialized
nsliders = length(h.sld);
set(h.sld, {'Callback'}, repmat({{@slidercallback, h}}, nsliders, 1));
end

function slidercallback(~, ~, h)
% Update background color of our axes object every time the slider is updated
RGB = [get(h.sld(1), 'Value'), get(h.sld(2), 'Value'), get(h.sld(3), 'Value')]/255;
set(h.ax, 'Color', RGB');
end

当回调执行时,它们默认传递2个输入,调用对象和事件数据结构。如callback documentation中所述,您可以通过将所有内容包装到单元格数组中来将其他输入传递给回调。需要注意的一点是,传递给回调的变量的值是它在定义回调时存在的值。换句话说,如果我们在创建它们的同时为我们的滑块设置回调,那么当Red的回调被触发时h将仅包含我们图形的句柄,当触发Green的回调时h 1}}将包含我们的图形和红色滑块的句柄,依此类推。

因此,一旦我们初始化了所有图形对象,你就会看到我已经定义了回调。使用大括号设置多个对象的属性在MATLAB的set文档中进行了解释。我使用repmat,因此单元格数组的大小与我们的滑块对象数组的大小相同。