GUI开发时,一般采用‘一前一后’双线制模式。所谓“一前”,即所见所得的这种界面布置,属于前端设计,用户通过鼠标拖拽控件,放置到预设的位置,调整好各个控件的大小即可。所谓“一后”,即指对各控件的操作、处置等引发的功能的具体实现,包括回调函数的定义等,属于后端设计。前端设计的是图像界面,保存成扩展名为fig的图形文件,后端设计的是函数,保存成扩展名为m的MATLAB文件。一前一后看似两个不同的层面,实际上是统一在一起的一个有机整体。

例如,将一个按钮拖到GUI的布局区域,用户可以使用鼠标对其大小、位置等各种属性进行所见所得的设计,双击该按钮,则会打开它的属性访问表,在属性表里,可以对它进行各种设置,比如背景设置、单位设置、标题、字体等各种属性的设置。假如我们想将这个按钮标题修改为“创建文件写入文字”,找到String选项,将文字进行修改,键入回车能立刻看到修改的效果,这里还将按钮的背景改为鲜艳的红色(如下图)。

打开网易新闻 查看精彩图片

设置完成后,若对设计布局满意,则可以将它保存到文件中,比如保存为MyButton.fig;一旦保存,MATLAB就会生成与这前端图形界面对应的后端函数文件,这些文件包括:

• function varargout = MyButton(varargin)

• function MyButton_OpeningFcn(hObject, eventdata, handles, varargin)

• function varargout = MyButton_OutputFcn(hObject, eventdata, handles)• function pushbutton1_Callback(hObject, eventdata, handles)

这四个函数文件是MATLAB自动生成的基本框架文件,它能支撑我们刚刚设计的GUI程序的运行,例如,用户点击工具栏中的绿色右向三角形,会生成我们设计的GUI,但只有一个按钮。并且可以被按下与弹起,但什么也做不了。

实际上,在MTALAB中,每个GUI编辑器产生的函数文件,都会包含这四个文件,其中和保存文件名称相同的函数称为主函数,如这里的MyButton函数。第二个是和界面启动相关的启动子函数,一般来讲,启动子函数是完整但不完善的函数,说它完整,是指从语法的角度看,它的确支持运行,没有任何语法问题;说它不完善,是指从功能的角度看,它并未完成什么功能,它要求GUI设计人员根据任务填入必要的代码。启动子函数在GUI所有组件建立之后,但在将这些组件显示到屏幕之前运行,主要用来为GUI的使用做好数据和界面的准备工作。该函数命名的规则是:主文件名_OpeningFcn(hObject, eventdata, handles, varargin)。第三个是输出子函数,该函数命名的规则是:主文件名_OutputFcn(hObject, eventdata, handles)。第四个是回调子函数,打开代码段,常常具有如下的格式:

function pushbutton1_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

其中,回调函数的名称为pushbuttonX_Callback。pushbutton即英文书写的按钮。MATLAB在创建控件的回调函数时,通常以控件名称英文名称回调函数的开始,之后紧跟着数字X,表示该类控件建立的先后顺序,具体到本例,pushbutton1是指建立了按钮控件,且编号为1,之后以下拉线连接固定的回调函数名称与输入参数列表。回调函数定义具体格式如下图所示。

打开网易新闻 查看精彩图片

用户也可以不使用默认的pushbuttonX而改为更有意义且易辨认的名称,这可通过修改该按钮的Tag属性实现,比如可以修改为File,则在保存时,会创建以File_Callback为函数名的回调函数。回调函数默认带有3个输入参数:第一输入参数hObject为本按钮的句柄;第二个输入参数eventdata是保留关键字,留给未来版本的MATLAB使用;第三个输入参数handles是一个结构变量,它保存着界面组件的所有句柄与用户数据,属于GUI数据变量。

整个函数除了第一行外,函数体全部为空,因为我们只是将按钮控件拖放到设计区,还未曾给它设定任务,自然只能是一个“什么也不干”的空回调函数。按习惯,需要将按钮的功能标示在按钮上,这可通过属性编辑进行修改。例如,我们希望这个按钮按下去后,会在后台创建一个文件并写入文字,则可将这个按钮的标题修改为“创建文件写入文字”,具体的修改效果已在下图中展示出来。

再回到回调函数。现在给回调函数添加一些代码,设定按钮按下后,将建立一个名为TestButton的文本文件,并在文件中写入一句话,则可以输入如下的代码:

fid= fopen('TestButton.txt','w');

fprintf(fid,'%s','This file is made by push button at ');

timeStamp =datestr(now ,31 );

fprintf(fid,'%s\n',timeStamp);

fclose(fid);

保存后,运行该GUI(工具栏中的绿色右向三角形),生成的GUI如下图所示;点击该按钮,则在该GUI工作路径下,可找到生成的文件。

打开网易新闻 查看精彩图片

按下按钮,实际上是发生了一个事件,对该事件的响应,或者说对该事件如何处置,回调函数则给予了回答。这实际上是面向对象编程的处理方式,用户只需记住按下按钮相当于调用了回调函数。在回调函数中,用户可以设定各种功能。比如,我们可设定打开Windows系统下的有道词典,假如Windows桌面上有有道词典的快捷方式,则可以通过查询该软件的属性(如下图),将“属性”界面下的“目标”内容作为系统命令,传递给MATLAB的系统函数system:

system('C:\Users\MAZHAIPU\AppData\Local\Youdao\Dict\Application\YodaoDict.exe')

打开网易新闻 查看精彩图片

则按下按钮时,会打开有道词典。

此时,完整的回调函数如下:

function File_Callback(hObject, eventdata, handles)

% hObject handle to File (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

fid= fopen('TestButton.txt','w');

fprintf(fid,'%s','This file is made by push button at ');

timeStamp =datestr(now ,31 );

fprintf(fid,'%s\n',timeStamp);

fclose(fid);

system('C:\Users\MAZHAIPU\AppData\Local\Youdao\Dict\Application\YodaoDict.exe')