matlab-两个gui的数据传递

一、程序


1.主程序:main.m

% 函数功能介绍:
% 将 main 中的原有数据(文本框内的数据),发送到 set_rgb_value 中,然后在 set_rgb_value 中设定 rgb
% 的值后,返回 main 中,完成 rgb 值的设定。

function varargout = main(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @main_OpeningFcn, ...
                   'gui_OutputFcn',  @main_OutputFcn, ...
                   'gui_LayoutFcn',  [], ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
   gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function main_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
% 预加载初始数据
load('rgb_data.mat')
set(handles.edit1,'string',num2str(rgb))

% Update handles structure
guidata(hObject, handles);

function varargout = main_OutputFcn(hObject, eventdata, handles)

varargout{1} = handles.output;

function edit1_Callback(hObject, eventdata, handles)


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

rgb1 = str2num(get(handles.edit1,'string'));
% main 程序中的数据传入 set_rgb_value 程序;经设定之后,再传回 main 程序
rgb = set_rgb_value(rgb1);
set(handles.edit1,'string',num2str(rgb))
save('rgb_data.mat','rgb')

2.子程序:set_rgb_value.m

function varargout = set_rgb_value(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @set_rgb_value_OpeningFcn, ...
                   'gui_OutputFcn',  @set_rgb_value_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function set_rgb_value_OpeningFcn(hObject, eventdata, handles, varargin)
% rgb_pre 代表初始传入数据;rgb 代表经修改之后的数据
global rgb_pre rgb
rgb_pre = varargin{1};
set(handles.slider1,'Value',rgb_pre(1))
set(handles.slider2,'Value',rgb_pre(2))
set(handles.slider3,'Value',rgb_pre(3))

set(handles.edit1,'string',rgb_pre(1))
set(handles.edit2,'string',rgb_pre(2))
set(handles.edit3,'string',rgb_pre(3))

rgb = varargin{1};

handles.output = rgb_pre;

% Update handles structure
guidata(hObject, handles);
% UIWAIT makes set_rgb_value wait for user response (see UIRESUME)
uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = set_rgb_value_OutputFcn(hObject, eventdata, handles) 

varargout{1} = handles.output;
% 当数据从 set_rgb_value 中输出到 main 中后,将窗口关闭
delete(handles.figure1);

function slider1_Callback(hObject, eventdata, handles)

global rgb
rgb(1) = get(hObject,'Value');
set(handles.edit1,'string',rgb(1))

function slider2_Callback(hObject, eventdata, handles)

global rgb
rgb(2) = get(hObject,'Value');
set(handles.edit2,'string',rgb(2))

function slider3_Callback(hObject, eventdata, handles)

global rgb
rgb(3) = get(hObject,'Value');
set(handles.edit3,'string',rgb(3))

function pushbutton1_Callback(hObject, eventdata, handles)

global rgb
handles.output = rgb;
guidata(hObject, handles);
uiresume(handles.figure1)

function pushbutton2_Callback(hObject, eventdata, handles)

global rgb_pre
handles.output = rgb_pre;
guidata(hObject, handles);
uiresume(handles.figure1)

function figure1_CloseRequestFcn(hObject, eventdata, handles)
% 关闭窗口与 cancel 按键功能一样,因此代码相同
global rgb_pre
handles.output = rgb_pre;   % 将数据发送到 handles.output 中。程序在 OpeningFcn 使用 uiwait,使程序等待,当遇到 uiresume 时程序继续运行,执行 OutputFcn ,将 set_rgb_value 中修改之后的值通过 handles.output 输出
guidata(hObject, handles);  % 当 handles 结构体中的数据发生改变时,必须使用 guidata 更新 handles 结构体
uiresume(handles.figure1)

function edit1_Callback(hObject, eventdata, handles)

global rgb
rgb(1) = str2double(get(hObject,'string'));
set(handles.slider1,'Value',rgb(1))

function edit2_Callback(hObject, eventdata, handles)

global rgb
rgb(2) = str2double(get(hObject,'string'));
set(handles.slider2,'Value',rgb(2))

function edit3_Callback(hObject, eventdata, handles)

global rgb
rgb(3) = str2double(get(hObject,'string'));
set(handles.slider3,'Value',rgb(3))

二、注解:

该博文中的使用uiwait(使程序在使用该语句的地方断开,程序等待,但是程序依然可以响应事件)和uiresume(继续执行被uiwait中断的程序)完成两个gui的数据传递。为什么uiwait要放在OpeningFcn中以及delete(handles.figure1)放在OutputFcn中?

可以参考matlab-gui的运行流程与matlab的数据传递方式(后有该文链接)。这里简单说一下:

1.如果不使用uiwait,在main.m中调用set_rgb_value.m,这样会直接执行OpeningFcn,再执行OutputFcn,在还没有对空间进行操作时,数据已经发送回main.m中;

2.程序在执行OpeningFcn时,已经完成了gui的创建,因此uiwait放在OpeningFcn中不会出错;

3.delete(handles.figure1)放在OutputFcn中,而CloseRequest_Fcn中没有使用,这时因为我们要求在,传递完数据之后,set_rgb_value窗口关闭,而在关闭前,我们需要使用handles.output 对varargout{1}赋值完成数据的传递,这时如果在CloseRequest_Fcn中删除窗口,则handles结构体在执行OutputFcn不可以获得,造成程序出错(当然通过这里的分析,也可以不使用handles.output,使用全局变量避开这个问题,这时也可以在CloseRequest_Fcn中删除)。


三、百度云链接:

链接:http://pan.baidu.com/s/1dFuZCZ3 密码:vep6


  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nachifur

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值