Matlab GUI学习02: 使用GUIDE开发图形界面程序

Matlab GUI学习02: 使用GUIDE开发图形界面程序

  • GUIDE
    • GUIDE简介
    • 使用GUIDE开发GUI
  • GUIDE数据管理
  • GUIDE编程实例
    • GUIDE编程实例01: 带有菜单栏的GUI编程
    • GUIDE编程实例02: 带有右键菜单的GUI编程
    • GUIDE编程实例03: 响应鼠标事件的GUI编程
    • GUIDE编程实例04: 响应键盘事件的GUI编程
    • GUIDE编程实例05: 显示时间的GUI编程

GUIDE

GUIDE简介

GUIDE(Graphical user interface design environment)可以使用图形化界面,使用拖拽的方式开发GUI.
在MATLAB命令行中输入guide就可以打开GUIDE,其基本界面如下:
Matlab GUI学习02: 使用GUIDE开发图形界面程序_第1张图片
在上边可以像VC一样拖拽式绘制GUI,点击右键菜单中的查看回调可以在源程序文件中修改其对应的回调函数.

使用GUIDE开发GUI

下面演示一个使用GUIDE开发GUI的例子,来自官方文档

  1. 在命令行中输入guide打开GUIDE.

  2. 在布局中添加下面控件
    Matlab GUI学习02: 使用GUIDE开发图形界面程序_第2张图片

  3. 通过修改控件的String属性,改变各个控件在屏幕上显示的字符串
    Matlab GUI学习02: 使用GUIDE开发图形界面程序_第3张图片

  4. 保存文件,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不会进行初始化,回调函数也不起作用.

  5. 修改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的修改才有效.

  6. 编写下拉菜单的回调函数:
    右键点击控件>查看回调>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}代表列表被选项.

  7. 编写按钮的回调函数
    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);
    
  8. 运行App: 点击运行按钮运行 App,其效果如下:
    Matlab GUI学习02: 使用GUIDE开发图形界面程序_第4张图片

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控件完全相同.
Matlab GUI学习02: 使用GUIDE开发图形界面程序_第5张图片

GUIDE编程实例02: 带有右键菜单的GUI编程

  1. 在在GUIDE菜单栏中找到菜单编辑器->上下文菜单,在图形化界面里编辑菜单.
    Matlab GUI学习02: 使用GUIDE开发图形界面程序_第6张图片
  2. 给对应ui控件的UIContextMenu属性赋值为对应的右键菜单.
    figure控件的UIContextMenu赋值为globalMenu;给axes控件的UIContextMenu赋值为axesMenu.
    Matlab GUI学习02: 使用GUIDE开发图形界面程序_第7张图片
    菜单栏菜单项一样,右键菜单菜单项也可以当作一般的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

  1. 绘制GUI布局如下:
    Matlab GUI学习02: 使用GUIDE开发图形界面程序_第8张图片

  2. 编写界面鼠标点击事件的回调函数
    我们定义两个全局变量,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赋值为0

    function figure_WindowButtonUpFcn(hObject, eventdata, handles)
    global ButtonDown
    ButtonDown = 0;
    
  3. 编写界面鼠标移动事件的回调函数
    鼠标移动时,首先判断当前鼠标是否按下. 若鼠标被按下,则在移动前后位置处画出一条直线,并更新当前鼠标位置.

    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
    
  4. 运行App,效果如下所示
    Matlab GUI学习02: 使用GUIDE开发图形界面程序_第9张图片

GUIDE编程实例04: 响应键盘事件的GUI编程

界面键盘按下事件界面键盘释放事件对应的回调函数分别为WindowKeyPressFcnWindowKeyPressFcn,可以通过figure对象的CurrentCharacter查看当前操作的按键.(详情见官方文档)

GUIDE编程实例05: 显示时间的GUI编程

要想在MATLAB中显示时间,必然涉及多线程的编写,MATLAB的timer对象可以实现多线程编程.

timer对象常用的属性如下(详细参考官方文档)

  • TimerFcn: 定时到达之后所执行的回调函数
  • ExecutionMode: 执行模式,其可选值如下表
    执行模式 时间 Period 起点
    'singleShot' 在此模式中,计时器回调函数仅执行一次. 因此,Period 属性没有任何作用.这是默认的执行模式.
    'fixedRate' 在将计时器回调函数添加到 MATLAB 执行队列中后立即启动
    'fixedDelay' 在计时器回调函数经过一段时滞(因 MATLAB 执行队列中出现延迟)后重新开始执行时启动
    'fixedSpacing' 在计时器回调函数完成执行时启动
    Matlab GUI学习02: 使用GUIDE开发图形界面程序_第10张图片
  • Period: 定时周期,以秒为单位.

下面我们编写一个时钟程序如下:

  1. 编写GUI界面: 编写GUI界面如下: 静态文本框的Tag标签为'timeDisplay'
    Matlab GUI学习02: 使用GUIDE开发图形界面程序_第11张图片
  2. 编写更新时间代码:
    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)));
    
  3. 运行App,效果如下所示: 动态显示当前时间.
    Matlab GUI学习02: 使用GUIDE开发图形界面程序_第12张图片

你可能感兴趣的:(MATLAB学习笔记)