pdf版本笔记的下载地址: Matlab GUI学习02_使用GUIDE开发图形界面程序(访问密码:3834)
Matlab GUI学习02:使用GUIDE开发图形界面程序
GUIDE
GUIDE简介
GUIDE
(Graphical user interface design environment
)可以使用图形化界面,使用拖拽的方式开发GUI.
在MATLAB命令行中输入guide
就可以打开GUIDE
,其基本界面如下:
在上边可以像VC一样拖拽式绘制GUI,点击右键菜单中的查看回调
可以在源程序文件中修改其对应的回调函数.
使用GUIDE开发GUI
下面演示一个使用GUIDE开发GUI的例子,来自官方文档
-
在命令行中输入
guide
打开GUIDE
. -
在布局中添加下面控件
-
通过修改控件的
String
属性,改变各个控件在屏幕上显示的字符串
-
保存文件,
GUIDE
创建了两个文件: 一个图形文件simple_gui.fig
和一个程序文件simple_gui.m
. 但 App 无法响应,因为simple_gui.m
不包含任何执行操作的语句.要在不打开
GUIDE
的情况下运行使用GUIDE
创建的App,可以通过在MATLAB命令行中键入 App 的名称来执行其代码文件,如:simple_gui
也可以使用 run 命令来运行该代码文件,如:
run simple_gui
不要尝试通过在
GUIDE
以外打开App的.fig
文件来运行App.如果这样做,图窗会打开并显示就绪状态,但UI不会进行初始化,回调函数也不起作用. -
修改
easy_gui_OpeningFcn
函数:
xxx_OpeningFcn
在GUI打开时被调用,进行初始化,是每个GUIDE
生成的代码文件的第一个回调.
把下面代码加入到easy_gui_OpeningFcn
函数首部,创建用于绘图的数据.% Create the data to plot. handles.peaks=peaks(35); handles.membrane=membrane; [x,y] = meshgrid(-8:.5:8); r = sqrt(x.^2+y.^2) + eps; sinc = sin(r)./r; handles.sinc = sinc; % Set the current data value. handles.current_data = handles.peaks; surf(handles.current_data)
这段程序生成了数据集
peaks
,membrane
,和sinc
,并将它们保存在handles
结构体中.
在GUIDE
程序中,全局变量一般存储在handles
结构体中,在各个回调函数之间调用和修改. 语句guidata(hObject, handles);
将对handles
的修改绑定到hObject
上,只有这样,对handles
的修改才有效. -
编写下拉菜单的回调函数:
右键点击控件>查看回调
>Callback
查看对象的回调函数.
在回调函数的头部添加下面代码:% Determine the selected data set. str = get(hObject, 'String'); val = get(hObject,'Value'); % Set current data to the selected data set. switch str{val}; case 'peaks' % User selects peaks. handles.current_data = handles.peaks; case 'membrane' % User selects membrane. handles.current_data = handles.membrane; case 'sinc' % User selects sinc. handles.current_data = handles.sinc; end % Save the handles structure. guidata(hObject,handles)
其中
str= cellstr(get(hObject,'String'))
以元胞数组形式返回参数列表所有选项,get(hObject,'Value')
返回被选项的序号,因此str{val}
代表列表被选项. -
编写按钮的回调函数
对Surf
按钮的回调函数,添加下面内容:% Display surf plot of the currently selected data. surf(handles.current_data);
对
Mesh
按钮的回调函数,添加下面内容:% Display mesh plot of the currently selected data. mesh(handles.current_data);
对
Contour
按钮的回调函数,添加下面内容:% Display contour plot of the currently selected data. contour(handles.current_data);
-
运行App: 点击运行按钮运行 App,其效果如下:
GUIDE数据管理
gui数据
使用handles
结构体保存. 当GUIDE
创建gui
时,handles
结构体即已经生成.
gui数据
的查询: 可以通过handles.tag
查询到对应的gui数据
. 其中tag
可以是自定义的对象属性,也可以是创建GUI时控件的Tag
属性,通过该属性可以找到控件的句柄.gui数据
的保存: 使用guidata(hObject, handles);
保存对gui数据
的更改,在回调函数中修改handles
后,只有执行此句才能将更改保存下来,在其他函数中调用.
GUIDE编程实例
GUIDE编程实例01: 带有菜单栏的GUI编程
在GUIDE
菜单栏中找到菜单编辑器
>菜单栏
,在图形化界面里编辑菜单栏.
- 其中
标签
属性相当于图形控件的String
属性,改变菜单按钮在界面上显示的值. - 其中
标记
属性相当于图形控件的Tag
属性,改变菜单按钮的句柄.
菜单按钮可以看作一般的gui控件,其回调函数的写法和用法与一般的gui控件完全相同.
GUIDE编程实例02: 带有右键菜单的GUI编程
- 在在
GUIDE
菜单栏中找到菜单编辑器
->上下文菜单
,在图形化界面里编辑菜单.
- 给对应ui控件的
UIContextMenu
属性赋值为对应的右键菜单.
给figure
控件的UIContextMenu
赋值为globalMenu
;给axes
控件的UIContextMenu
赋值为axesMenu
.
与菜单栏菜单项一样,右键菜单菜单项也可以当作一般的UI控件来对待,其回调函数的写法和用法与一般UI控件完全相同.
GUIDE编程实例03: 响应鼠标事件的GUI编程
-
界面鼠标点击事件
对应的回调函数为WindowButtonDownFcn
;可以通过SelectionType
查看鼠标事件相应的鼠标键位(详情见官方文档)
下表列出了可能的 SelectionType 值以及生成这些值的用户操作。值 对应的操作 ‘normal’ 点击鼠标左键 ‘extend’ 以下任一操作:
1. Shift-点击鼠标左键
2. 点击鼠标中键
3. 同时点击鼠标左键和右键。‘alt’ 下列任一操作
1. Control-点击鼠标左键
2. 点击鼠标右键。‘open’ 双击任何鼠标按键。 -
界面鼠标移动事件
对应的回调函数为WindowButtonMotionFcn
. 可以通过axes
对象的CurrentPoint
属性查看鼠标移动到的坐标.(详情见官方文档)(话说这个设定好智障,明明鼠标移动事件是绑定在figure
对象上的,可是鼠标坐标只能在axes
对象上得到)
下面我们编写一个能用鼠标进行绘图的App
-
绘制GUI布局如下:
-
编写
界面鼠标点击事件
的回调函数
我们定义两个全局变量,ButtonDown
记录鼠标当前是否被按下,pos1
记录鼠标当前的位置.
当鼠标被按下时,将ButtonDown
赋值为1,并将当前鼠标位置记录在pos1
中function figure_WindowButtonDownFcn(hObject, eventdata, handles) global ButtonDown pos1; % ButtonDown记录鼠标是否按下,pos1记录鼠标到达的位置 if strcmp(get(gcf, 'SelectionType'), 'normal') % 判断按下的是否是鼠标左键 ButtonDown = 1; pos1 = get(handles.axes1, 'CurrentPoint'); end
当鼠标被松开时,将
ButtonDown
赋值为0function figure_WindowButtonUpFcn(hObject, eventdata, handles) global ButtonDown ButtonDown = 0;
-
编写
界面鼠标移动事件
的回调函数
鼠标移动时,首先判断当前鼠标是否按下. 若鼠标被按下,则在移动前后位置处画出一条直线,并更新当前鼠标位置.function figure_WindowButtonMotionFcn(hObject, eventdata, handles) if ButtonDown == 1 pos = get(handles.axes1, 'CurrentPoint'); line([pos1(1, 1) pos(1, 1)], [pos1(1, 2) pos(1, 2)], 'LineWidth', 4); pos1 = pos; end
-
运行App,效果如下所示
GUIDE编程实例04: 响应键盘事件的GUI编程
界面键盘按下事件
和界面键盘释放事件
对应的回调函数分别为WindowKeyPressFcn
和WindowKeyPressFcn
,可以通过figure对象的CurrentCharacter
查看当前操作的按键.(详情见官方文档)
GUIDE编程实例05: 显示时间的GUI编程
要想在MATLAB中显示时间,必然涉及多线程的编写,MATLAB的timer
对象可以实现多线程编程.
timer
对象常用的属性如下(详细参考官方文档)
TimerFcn
: 定时到达之后所执行的回调函数ExecutionMode
: 执行模式,其可选值如下表执行模式 时间 Period 起点 'singleShot'
在此模式中,计时器回调函数仅执行一次. 因此,Period 属性没有任何作用.这是默认的执行模式. 'fixedRate'
在将计时器回调函数添加到 MATLAB 执行队列中后立即启动 'fixedDelay'
在计时器回调函数经过一段时滞(因 MATLAB 执行队列中出现延迟)后重新开始执行时启动 'fixedSpacing'
在计时器回调函数完成执行时启动 Period
: 定时周期,以秒为单位.
下面我们编写一个时钟程序如下:
- 编写GUI界面: 编写GUI界面如下: 静态文本框的
Tag
标签为'timeDisplay'
- 编写更新时间代码:
在xxx_OpeningFcn
中加入如下代码: 创建timer
对象,用来每一秒查询一次当前时间并展示在静态文本框中.
编写handles.ht = timer(..., 'ExecutionMode', 'FixedRate', ... 'Period', 1, ... 'TimerFcn', {@qureyTime, handles}); start(handles.ht);
timer
对象的回调函数qureyTime
function qureyTime(hObject, eventdata, handles) set(handles.timeDisplay, 'String', strcat('Current Time:', datestr(now)));
- 运行App,效果如下所示: 动态显示当前时间.
pdf版本笔记的下载地址: Matlab GUI学习02_使用GUIDE开发图形界面程序(访问密码:3834)