基于MATLAB GUI的上位机软件设计学习—GUI M文件主界面
最近因为负责的项目需要搭建上位机软件,作为电源监控系统的上位机软件,进行电源实时监控,并分析历史故障信息,因为后续还想做故障诊断系统以及现有系统和本项目的不完全兼容,因此萌发了使用MATLAB GUI做一个上位机软件的想法;
主要考虑使用MATLAB利于后续故障诊断系统的开发,同时QT实在不会啊,很难受有木有!仗着自己会点MATLAB,所以开始了基于MATLAB GUI制作上位机软件的过程,为了便于查找,同时方便其他苦苦挣扎的小伙伴,把学习过程作为一个系列博客发表在CSDN中。好了,话不多说,我要开始我的学习了~~~~~~~~
首先我还是知道使用
>> guide
打开一个Blank GUI界面(Tip:个人学习过程喜欢在使用中学习)
虽然这个界面我看的一脸懵逼,所以我就找啊找,然后通过视图–>编辑器打开了M文件编辑器。打算先瞧瞧。
看得我更懵逼了,所以就从这个空白代码学起把。
经过我一番查找资料,在《MATLAB GUI学习手记》第6章中查找到了相关介绍,搬在此,方便查找。
GUI的M伟岸,控制GUI并决定GUI对用户操作的响应。GUI运行的所有代码都在M文件中,因此搞懂M文件很重要。
M文件有一系列子函数构成,包含主函数、Opening函数、Output函数和回调函数。
function varargout = untitled(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @untitled_OpeningFcn, ...
'gui_OutputFcn', @untitled_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 untitled_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for untitled
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = untitled_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
先来说说gui_Singleton = 1;
该语句主要用于指定是否只能产生一个界面。当gui_Singleton = 0;
时,表示GUI可以产生多个窗口实例;当gui_Singleton = 1;
时,表示GUI只能产生一个窗口实例允许GUI产生对个窗口实例,可在GUI编辑界面的菜单里选择:工具->GUI选项–>【GUI仅允许运行一个实例(单个)】的勾,此时gui_SIngleton自动更新为0(实测需要保存之后才会修改,不如M文件中进行修改)。
gui_State是一个结构体,指定了figure的Opening函数和Output函数;开始gui_Callback为空,此时创建GUI;如果输入参数个数大于1,且第一个输入参数为字符串,第二个参数为聚丙酯,则将输入的地图给参数传递给gui_State.callback,此时执行回调函数*(tip:具体作用还有待发掘)*。
(注:句柄实质上是一个指针。gui中一般都是指向控件的指针,可以得到该控件所有信息;百度查询所得
)
function varargout = untitled(varargin)
为主函数声明,为了偷懒没有取主函数名,使用了默认的untitled函数名,varargin为输入参数,varargout为输出参数。当创建GUI时,varargin为空;当用户触发GUI对象时,varargin为1个1*4的单元数组,第一个单元为所要执行回调函数的函数名。
e.g. 单击了Tag值为pushbutton1的pushbutton对象,此时varargin{1}=‘pushbutton1_Callback’,即为要执行的回调函数pushbutton1_Callback的函数名。第2~4个单元为该回调函数的输入参数:hObject、eventdata和handles。
hObject:当前回调函数对应的GUI对象句柄;
eventdata:附加参数;
handles:当前GUI所有数据的结构体,包含所有HUI对象的句柄和用户定义数据。
下面再说一下gui_Stata结构体参数的含义。
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @untitled_OpeningFcn, ...
'gui_OutputFcn', @untitled_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
用于判断是创建GUI还是执行回调函数。若输入参数至少为1个且第一个为字符串,则令结构体gui_State的字段gui_Callback的值第1个输入参数表示的回调函数;若没有输入参数,则字段gui_Callback的值为空,此时创建GUI实例。
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
用于运行GUI默认的处理函数:gui_mainfcn。该函数用于处理GUI创建、GUI布局和回调函数。当输出参数存在时,输出参数有函数gui_mainfcn返回;当输出参数不存在时,直接运行函数gui_mainfcn。
函数gui_mainfcn时GUI默认的处理函数。gui_mainfcn根据gui_State和传入参数来确定是执行回调函数,还是打开GUI并运行OpeningFcn和OutputFcn。如果gui_Callback为空,那么就运行GUI,打开主窗口fig文件否则,执行gui_Callback指定的子函数。
本文对于gui_mainfcn函数不详细介绍,主要是本人懒得去研究,目前啥都不懂,为啥要自寻烦恼呢,后续有需要再去研究,这里只需要认识它,不至于看到它一脸懵逼,做到心里有数就行。
这篇文章就到这吧,去做午饭了~~~~~~~~~~~