在用多個matlab的figure進行數(shù)據(jù)交互時,數(shù)據(jù)傳入是較為簡單的,可以直接用function的形參實現(xiàn),但如何把數(shù)據(jù)傳回,是個比較麻煩的問題。
在GUIDE下,系統(tǒng)自動生成了output_fcn函數(shù),可以用它來實現(xiàn)從子窗口到主窗口的數(shù)據(jù)傳回,但如果是手寫figure,就沒有這個函數(shù)了。為此,考慮用setappdata和getappdata來實現(xiàn)這個功能。
寫了個簡單的demo程序,先看下效果:
程序一上來,先打開上面的主窗口,里面的編輯框里寫了一些字符參數(shù)。點擊按鈕,可以打開第二個窗口,也就是子窗口,里面?zhèn)魅肓酥鞔翱诶锏膮?shù)。
子窗口也有一個編輯框和一個按鈕,編輯框里顯示的是從主界面?zhèn)魅氲淖兞???梢栽谶@里手改。改動后,點擊按鈕,子窗口就自動消失,然后改動的變量在主界面里顯示。
?
這就實現(xiàn)了數(shù)據(jù)的互相傳遞了。
?下面,直接把代碼附上,在講解。
function main
% 創(chuàng)建示例數(shù)據(jù)
data.info.name = 'test';
data.info.date = '2022-10-10';
data.info.flag = 'true';
data.test = rand(10);
info = data.info;
% 創(chuàng)建窗口
hfig = figure('Tag','main_fig123',...
'Name','主窗口',...
'NumberTitle','off',...
'Units','normalized',...
'position',[0.3 0.3 0.4 0.4],...
'Toolbar','none',...
'MenuBar','none',...
'Resize','on',...
'DockControls','off',...
'Color',[0.9255 0.9137 0.8471]);
% 創(chuàng)建按鈕控件
hbtn = uicontrol(hfig,...
'Style','pushbutton',...
'String','打開子窗口',...
'Tag','ok_button',...
'units','normalized',...
'position',[0 0.8 1 0.1],...
'Callback',{@sub});
% 創(chuàng)建編輯控件
hed1 = uicontrol(hfig,'Style','edit','Tag','edit1','String',info.name,...
'units','normalized','position',[0.2 0.6 0.6 0.1]);
hed2 = uicontrol(hfig,'Style','edit','Tag','edit2','String',info.date,...
'units','normalized','position',[0.2 0.4 0.6 0.1]);
hed3 = uicontrol(hfig,'Style','edit','Tag','edit3','String',info.flag,...
'units','normalized','position',[0.2 0.2 0.6 0.1]);
setappdata(hfig,'info',info);
end
function sub(hObj,event)
hfig = findobj('Tag','main_fig123');
if length(hfig)>1
return;
end
info = getappdata(hfig,'info');
% 創(chuàng)建窗口
hfig_sub = figure('Tag','main_fig',...
'Name','子窗口',...
'NumberTitle','off',...
'Units','normalized',...
'position',[0.4 0.4 0.3 0.3],...
'Toolbar','none',...
'MenuBar','none',...
'Resize','on',...
'DockControls','off',...
'Color',[0.9255 0.9137 0.8471]);
% 創(chuàng)建按鈕控件
hbtn = uicontrol(hfig_sub,...
'Style','pushbutton',...
'String','數(shù)據(jù)傳回',...
'Tag','ok_button',...
'units','normalized',...
'position',[0 0.7 1 0.1],...
'Callback',{@sub_btn_click});
% 創(chuàng)建編輯控件
hed1 = uicontrol(hfig_sub,'Style','edit','Tag','sub_e1','String',info.name,...
'units','normalized','position',[0.2 0.3 0.6 0.1]);
end
function sub_btn_click(hObj,event)
% 查找子窗口的編輯框
hed1 = findobj('Tag','sub_e1');
name = get(hed1,'String');
% 查找數(shù)據(jù)
hfig = findobj('Tag','main_fig123');
if length(hfig)>1
return;
end
info = getappdata(hfig,'info');
% 寫入新數(shù)據(jù)
info.name = name;
setappdata(hfig,'info',info);
% 關(guān)閉當(dāng)前窗口
close(gcf);
% 更新主窗口控件
hed1 = findobj('Tag','edit1');
set(hed1,'String',info.name);
end
程序不長,里面用兩個函數(shù)分別實現(xiàn)了主窗口和子窗口,另外對兩個按鈕的回調(diào)函數(shù)也進行了實現(xiàn)。主要邏輯是:
- 在主程序里先把要傳遞的數(shù)據(jù)存入主程序的某個控件中,比如就主窗口。
- 主程序點擊按鈕,召出子窗口。
- 子窗口找到主窗口的句柄,然后把appdata傳過來,再顯示到控件上。
- 子窗口點擊按鈕,將控件里的信息保存到appdata中(這里的信息是新信息)。這里其實已經(jīng)完成了數(shù)據(jù)傳遞,只要關(guān)閉窗口,并實現(xiàn)主程序的顯示邏輯即可。
還是很簡單的吧,而且都沒用到uiwait和uiresume。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-432087.html文章來源:http://www.zghlxwxcb.cn/news/detail-432087.html
?
到了這里,關(guān)于Matlab實現(xiàn)多個窗口間的數(shù)據(jù)傳遞(不用GUIDE)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!