1

我想在Matlab中编写一个 GUI 程序并使用uicontrol在其上制作 3 个滑块,然后编写callback以在一个命令中使用它们的 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".
4

2 回答 2

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 个输入,即调用对象和事件数据结构。正如回调文档中所解释的,您可以通过将所有内容包装到一个元胞数组中来将其他输入传递给您的回调。需要注意的一点是,传递给回调的变量的值是它在定义回调时存在的值。换句话说,如果我们在创建滑块的同时为滑块设置回调,当 Red 的回调被触发h时将只包含我们的图形的句柄,当 Green 的回调被触发h时将包含我们的图形的句柄和红色滑块,依此类推。

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

于 2015-12-09T12:47:21.763 回答
0

持久数据必须存储在回调函数可以访问的地方。一种常见的技术是使用父图形的UserData字段。在上面的示例中,一旦移动了一个滑块,当前颜色就可以在RGBfigure 的字段中fh找到UserData。此外,这里只使用了一个回调,UI 项通过其Tag.

fh = figure(1);
clf
%// Initialize figure's UserData
set(fh, 'UserData', struct('RGB', [0 0 0]));

sld_b = uicontrol('Style', 'slider',...
    'Min',0,'Max',255,'Value',0,...
    'Position', [400 20 120 20],...
    'Callback', @colourHandler, 'Tag', 'blue'); 
sld_g = uicontrol('Style', 'slider',...
    'Min',0,'Max',255,'Value',0,...
    'Position', [400 60 120 20],...
    'Callback', @colourHandler, 'Tag', 'green'); 
sld_r = uicontrol('Style', 'slider',...
    'Min',0,'Max',255,'Value',255,...
    'Position', [400 100 120 20],...
    'Callback', @colourHandler, 'Tag', 'red');

%// This is in a separate file, colourHandler.m
function colourHandler(source, ~)
    %// Find which slider triggered us
    if strcmpi(get(source, 'Tag'), 'red')
        ind = 1;
    elseif strcmpi(get(source, 'Tag'), 'green')
        ind = 2;
    else
        ind = 3;
    end
    %// update UserData
    ud = get(get(source, 'Parent'), 'UserData');
    ud.RGB(ind) = get(source, 'Value');
    set(get(source, 'Parent'), 'UserData', ud);
end
于 2015-12-09T06:33:33.457 回答