MATLAB GUI编程技巧汇编.docx
《MATLAB GUI编程技巧汇编.docx》由会员分享,可在线阅读,更多相关《MATLAB GUI编程技巧汇编.docx(35页珍藏版)》请在冰豆网上搜索。
![MATLAB GUI编程技巧汇编.docx](https://file1.bdocx.com/fileroot1/2022-10/28/ba872f8c-0432-4aa9-a526-140d2fc2f5da/ba872f8c-0432-4aa9-a526-140d2fc2f5da1.gif)
MATLABGUI编程技巧汇编
GUI编程技巧汇编
1.如何使gui编的界面一运行就居中?
方法一:
a>假如当前的figure的句柄是h,则在程序运行的刚开始,用这个命令,
set(h,'visible','off'); %使h对应的图不可见.
b>然后你再进行你的其它的操作,
c>最后,在程序的结尾部分,用这两个语句:
movegui(h,'center'); %将这个图移到中央.详细用法参阅help movegui
set(h,'visible','on'); %恢复其可见性.
方法二:
functionfigureMiddled
figure;
set(0,'units','pixels');
set(gcf,'units','pixels');
screenrect=get(0,'screensize');
screenwidth=screenrect(3);
screenheight=screenrect(4);
figwidth=600;
figheight=200;
figposition=[(screenwidth/2-figwidth/2)...
(screenheight/2-figheight/2)...
figwidthfigheight];
set(gcf,'position',figposition);
2.有关GUI实时显示的问题
首先,用MATLAB做实时显示其效果并不是很好,主要原因就是它的速度慢,尤其是你的程序中出现循环时,速度更慢.
前几天,我也做了一个实时显示的东西,我的做法如下:
1.建立一个图,如h=plot(x,y);
set(h,'erasemode','xor') %设置擦除方式.
2.建立一个死循环,不断的接受数据,并且不断的更新x,y
3. 用这个指令set(h,'xdata',x,'ydata',y),使x,y的数据不断的得到更新.
4.用屏幕刷新指令drawnow进行刷新.
就这个方法就可以做到实时了.
3.关于参数传递
关于参数传递主要有三种方法:
1).就是用定义全局变量的方法来实现,如global a,等这种用法,这种一般用在小程序中,因为如果全局变量太多的话,会造成系统混乱.
2).应用对象的userdata属性,直接通过对象的userdata属性来进行各个callback之间的数据存取操作.首先把数据存到一个特定的对象中,然后在取出来,如下:
>>set('ui_handle','userdata',value)
>>value=get('ui_handle','userdata')
这种方法虽然简单,但是缺点是每个对象只能存取一个变量值.
3).利用setappdata,getappdata,rmappdata函数来实现,这几个函数来进行数据传递是最有弹性的.使用方法和第二种方法类似.
4.怎么直接将下面一段.txt格式导到MATLAB中?
用load命令loade:
\data\ccc.txt;我的文件是e盘data下的
其实还有一个方法可以导入,有没有试过textread呢
5.函数结构与参数传递
1)
最近简单整理了一下发过的东西,将大家比较困惑的两个问题,再强调一下。
这个问题我也曾经想过很久很久。
就是某个函数的子函数,可能具有复用性,而我又不想改变原来的函数,怎样才能调用这个子函数呢?
那就是给每一个函数加一个壳。
例如这个函数结构:
functionvarargout=test_function(varargin)
%....................
ifnargin==0
%创建界面。
%即使不创建界面,也可以采用这种函数结构。
figurehandle=test_generatefigurecontent;
%初始化函数,可以用于创建初始化数据。
test_initfiguecontent(figurehandle);
ifnargout>0
varargout{1}=figurehandle;
end
elseifischar(varargin{1})
try
ifnargout>0
[varargout{1:
nargout}]=feval(varargin{:
});
else
feval(varargin{:
});
end
catch
disp(lasterr);
end
end
%-------------------------------------------------------------------------
functionfigurehandle=test_generatefigurecontent;
.....................................
handles=guihandles(figurehandle);
guidata(figurehandle,handles);
%--------------------------------------------------
functiontest_initfiguecontent(h)
handles=guidata(h);
DefaultData=test_GetDefaultData;
........................................
%--------------------------------------------------
functionDefaultData=test_GetDefaultData;
DefaultData.ParaName={'height';'width';};
DefaultData.ParaKanaName={'高度';'宽度';};
DefaultData.height=20;
DefaultData.width=5;
%--------------------------------------------------
functiontest_Uicontrol_Callback(h);
handles=guidata(h);
........................................
%return;
-------------------------------------------------------------------------
如果你要得到test_function里面的默认数据,就可以在其他函数中使用如下调用方式就能够得到:
DefaultData=test_function('test_GetDefaultData');
程序会通过这个转换器进入子函数:
elseifischar(varargin{1})
try
ifnargout>0
[varargout{1:
nargout}]=feval(varargin{:
});
else
feval(varargin{:
});
end
catch
disp(lasterr);
end
end
2)
关于参数传递
1.尽量在内存中提取:
方法有三种:
①采用function的varargin和varargout传送,②存在handle的ApplicationData中,③保存在handles里面。
当然还有其他方法。
2.存在硬盘上,采用save和load。
3.用全局变量,最次的办法,有时却是最好的办法。
关于nargin,nargout,varargin,varargout
nargin:
输入参数的个数,主要用于两个方面:
①判断输入参数的个数,如果输入参数个数不对,可以警告或其他处理;②根据参数个数的不同可以做不同的处理。
如:
ifnargin==0
error;
elseifnargin==1
…………
elseifnargin==2
…………
else
warndlg('……‘,’‘,‘modal')
return;
end
nargout:
输出参数的个数,用法同上。
varargin:
输入参数的总和,保存为cell结构。
提取方式如下:
A=varargin{1};
B=varargin{2:
end};
varargout输出参数。
见到的最常见的用法是:
ifnargout>0
varargout{1}=figurehandle;
end
3)
关于handles:
实际上这个handles是MATLAB中GUI编程中最常用的一个句柄管理变量。
handles的生成:
handles=guihandles(figurehandle);将figure中所有对象中“Tag”属性有值的句柄的handle采集在一起。
handles是结构名,每个“Tag”域名里保持此对象的句柄。
handles的保存:
guidata(figurehandle,handles);handles将保存在figure对象的“ApplicationData”的一个域名里。
handles的使用:
handles=guidata(h);其中为figure中任意一个对象的句柄。
handles.SpeechSourceGui可能是一个figure的句柄,“userdata”是一个对象的属性,可以在其中存取任何数据。
但是我不怎么用它,一则它只能存一个变量;二则它无法存入变量的名字,很难区分。
4)
关于feval
feval,首先我们可以把它理解为一个函数转换器。
执行到feval时,系统将首先寻找内部函数,如果没有找到,再尝试找外部函数。
feval也是一个函数封装器,在执行时它能够调用某个函数;但是在编译时,又可以不将这个函数编译到当前模块中。
feval还有一个很强大的功能,如果结合了这个函数结构,就可以在函数外部调用一个函数的内部函数或子函数。
5)
关于setappdata,getappdata
setappdata,将数据保存在对象的“ApplicationData”属性中。
getappdata,从对象的“ApplicationData”属性中提取数据,如果没有定义,就为空。
setappdata和getappdata操作的对象,最好为figure_handle,便于管理和扩展。
Matlab的高级编程和对象控制,将大量使用这两个函数。
6)
关于function_handle
function_handle在matlab环境下还是可以用的,但是不能支持编译,也就是说无法脱离matla