1

Matlabで GUI プログラムを作成し、 uicontrolを使用してその上に3 つのスライダーを作成し、1 つのコマンドで 3 つの値を使用するコールバックを作成したいと考えています。私のプログラムでわかるように、1 つのスライダーの関数を作成する方法を見つけました。これら 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 つの入力が渡されます。コールバックのドキュメントで説明されているように、すべてを cell 配列にラップすることで、追加の入力をコールバックに渡すことができます。注意すべきことの 1 つは、コールバックに渡される変数の値は、コールバックを定義したときに存在する値であるということです。言い換えれば、スライダーの作成と同時にスライダーのコールバックを設定すると、Red のコールバックが起動hされたときは Figure へのハンドルのみが含まれ、Green のコールバックが起動されたときは Figurehへのハンドルが含まれます。赤のスライダーなどに。

このため、すべてのグラフィックス オブジェクトを初期化すると、コールバックが定義されたことがわかります。中かっこを使用して複数のオブジェクトのプロパティを設定する方法については、MATLAB の のドキュメンテーションで説明されていsetます。repmatセル配列のサイズがスライダー オブジェクトの配列と同じサイズになるように使用します。

于 2015-12-09T12:47:21.763 に答える
0

永続データは、コールバック関数がアクセスできる場所に保存する必要があります。一般的な手法の 1 つは、親 Figure のUserDataフィールドを使用することです。上記の例では、スライダーが移動されると、現在の色がRGBfigurefhのフィールドに表示されUserDataます。また、ここでは 1 つのコールバックのみが使用され、UI アイテムはその .xml によって識別されます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 に答える