2015-12-09 3 views
1

Я хочу написать программу с графическим интерфейсом в Matlab и сделать 3 ползунки на нем UIControl, а затем написать CallBack с, чтобы использовать их 3 значения в одной команде. Я нашел способ написать функцию для одного слайдера, как вы можете видеть в моей программе. Можете ли вы помочь мне, как использовать эти 3 обратных вызова? (Я использую R2014a)UIControl обратного вызова для более чем одной функции

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". 

ответ

0

Постоянные данные должны храниться где-то, доступными для функции обратного вызова. Один общий метод - use the parent figure's UserData field. В приведенном выше примере, как только ползунок перемещен, текущий цвет можно найти в поле RGB рисунка fh's UserData. Кроме того, здесь используется только один обратный вызов, а элемент пользовательского интерфейса идентифицируется через его 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 
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 будет содержать дескриптор нашей фигуре и красном слайдере и так далее.

Из-за этого вы увидите, что я определил обратные вызовы после инициализации всех наших графических объектов. Использование фигурных скобок для задания свойств нескольких объектов объясняется в документации MATLAB для set. Я использую repmat, поэтому размер массива ячеек такого же размера, как и наш массив объектов слайдера.

Смежные вопросы