一个基于Matlab的简单Gui设计

 前几日浩子说要编一个基于Matlab的用户图像界面,他用GUIDE搭了一个大概的框架,大概要实现数据读入、做图分析、图像清除、关闭界面的功能,我用函数形式给改编了一个,虽然问题比较简单,但是也可以视为Gui设计的一个比较典型的问题,其实用Matlab编界面很简单,只是一个可视化的东西,真正的东西还是里面的程序。

    曾经自学过一段时间的Matlab的Gui界面设计,上学期学电机调速在做大作业的时候为了显得好看,还做了一个界面,这次借用上次的函数框架,一般的函数流程如下:1、建立一个Gui界面,对其中的默认属性进行设置。2、建立菜单栏。3、建立坐标轴区域以便做图。4、放置控件,比如按钮、文本、列表框等等。5、编写相应的回调函数,特别注意其中的配合关系。最后所实现的界面如图1所示。

一个基于Matlab的简单Gui设计

图1 所实现的界面

    根据上面的1、2、3、4步骤建立的对应于图1的函数程序如下所示:

   date:2010年10月21日修改
 author:dingqian
  email:dingqian12345@126.com
%function:基于Matlab的Gui用户图形界面
clc;
clear all;
close all;
delete(findall(0,'type','figure')); %删除所有图像文件
clf reset;

H_figure=figure(1);
set(0,'showHiddenHandles','on');

set(gcf,'unit','normalized'); %位置和坐标轴
set(gcf,'defaultuicontrolunits','normalized');
set(gcf,'defaultuicontrolfontsize',20);
set(gcf,'defaultuicontrolfontname','隶书');
set(gcf,'defaultuicontrolhorizontal','left');
set(gcf,'menubar','none');
str='基于Matlab的用户图形界面设计';
set(gcf,'name',str,'numbertitle','off');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%以上进行系统参数的设置
h_help=uimenu(H_figure,'label','&Help');
h_help_sub1=uimenu(h_help,'label','Author','callback','author','tag','h_sub_1');
h_help_sub2=uimenu(h_help,'label','About','callback','about','tag','h_sub_2');

h_color=uimenu(H_figure,'label','&Color');
h_color_sub1=uimenu(h_color,'label','White','callback','set(h_axes_1,''color'',''white''),set(h_axes_2,''color'',''white''),set(h_color_sub1,''checked'',''on''),set(h_color_sub2,''checked'',''off'')');
h_color_sub2=uimenu(h_color,'label','Yellow','callback','set(h_axes_1,''color'',''yellow''),set(h_axes_2,''color'',''yellow''),set(h_color_sub2,''checked'',''on''),set(h_color_sub1,''checked'',''off'')');

h_grid=uimenu(H_figure,'label','&Grid');
h_grid_sub1=uimenu(h_grid,'label','Grid on','callback','grid(h_axes_1,''on''),grid(h_axes_2,''on''),set(h_grid_sub1,''checked'',''on''),set(h_grid_sub2,''checked'',''off'')');
h_grid_sub2=uimenu(h_grid,'label','Gridoff','callback','grid(h_axes_1,''off''),grid(h_axes_2,''off''),set(h_grid_sub1,''checked'',''off''),set(h_grid_sub2,''checked'',''on'')');
%%%%%%%%%%%%%%%%%%%%%%%%% 以上为菜单的基本建立过程设置 %%%%%%%%%%%%%%%%%%%%%
h_text_1=uicontrol(H_figure,'style','text','string','Automation Department of Njust','position',[0.13 0.93 0.75 0.08],'tag','text_1','fontsize',20,'fontname','newtimes','BackgroundColor',[0.8 0.8 0.8]);
h_axes_1=axes('position',[0.10,0.58,0.6,0.3],'visible','on','tag','axes_1');%建立绘图区域
set(gca,'xtick',[],'ytick',[]);
h_text_2=uicontrol(H_figure,'style','text','string','无连线曲线','position',[0.33 0.88 0.18 0.05],'tag','text_2','fontsize',12,'BackgroundColor',[0.8 0.8 0.8]);
h_axes_2=axes('position',[0.10,0.18,0.6,0.3],'visible','on','tag','axes_2');%建立绘图区域
set(gca,'xtick',[],'ytick',[]);
h_text_3=uicontrol(H_figure,'style','text','string','有连线曲线','position',[0.33 0.48 0.18 0.05],'tag','text_2','fontsize',12,'BackgroundColor',[0.8 0.8 0.8]);
%%%%%%%%%%%%%%%%%%%%%%%%% 以上为图形的模块化的基本设置 %%%%%%%%%%%%%%%%%%%%%
h_text_4=uicontrol(H_figure,'style','text','string','信息显示如右:','position',[0.05 0.05 0.35 0.08],'tag','text_4','BackgroundColor',[0.8 0.8 0.8]);
h_text_5=uicontrol(H_figure,'style','text','string','','position',[0.40 0.05 0.35 0.08],'tag','text_5','BackgroundColor',[0.8 0.8 0.8]);

h_pushbutton_1=uicontrol(H_figure,'style','pushbutton','string','导入数据','position',[0.75,0.78,0.23,0.10],'tag','pushbutton_1','callback','plot_rawdata','BackgroundColor',[0.8 0.8 0.8]);
h_pushbutton_2=uicontrol(H_figure,'style','pushbutton','string','连线处理','position',[0.75,0.45,0.23,0.10],'tag','pushbutton_2','callback','plot_process','BackgroundColor',[0.8 0.8 0.8]);

h_listbox_1=uicontrol(H_figure,'style','popupmenu','string','无次序|有次序','position',[0.75 0.60 0.22 0.06],'tag','AlgrithmType','fontsize',12,'BackgroundColor',[0.8 0.8 0.8]);
h_text_6=uicontrol(H_figure,'style','text','string','选择连线类型','position',[0.75 0.66 0.32 0.08],'tag','text_6','BackgroundColor',[0.8 0.8 0.8],'fontsize',15);
h_pushbutton_3=uicontrol(H_figure,'style','pushbutton','string','清除图像','position',[0.75,0.29,0.23,0.10],'tag','pushbutton_3','callback','Reset','BackgroundColor',[0.8 0.8 0.8]);
h_pushbutton_4=uicontrol(H_figure,'style','pushbutton','string','关闭界面','position',[0.75,0.12,0.23,0.10],'tag','pushbutton_4','callback','close all','BackgroundColor',[0.8 0.8 0.8]);

    关于上述程序,有如下几点需要说明:(1)tag属性是Gui进行传递数据的一个重要途径,所以不能重复。而控件的类型使用style指定。(2)position是控件的位置,其中的四个数据分别对应于左下角横坐标、左下角纵坐标、控件宽度、控件长度,注意控件的位置调整。(3)为了使得界面好看,将Push Button、text等的背景色与figure的背景色一致。(4)注意菜单的强调&和是否选择属性checked。  

    关于回调函数的形式,有两种方式:比较简单的可以直接在callback属性中进行书写,比如关闭界面,直接可以用close all命令实现,值得注意的是,这种形式需要对里面的引号多加一个引号,即先将回调函数用正常的形式写出来,然后对各个语句都套上'',比如正常形式的函数为grid(h_axes_1,'on'),使用回调函数形式即为'callback','grid(h_axes_1,''on'')';对于比较复杂的回调函数,可以使用函数形式,然后在callback属性中填写函数名称即可。

    点击Help菜单下的子菜单Author,调用函数author,出来的信息如图2所示。

一个基于Matlab的简单Gui设计

图2 作者信息

    对应上图的程序如下:

msgbox({'单位:Njust 1002教研室', 'Email:dingqian12345@126.com','Name:DingQian'},'作者信息','help')
h1=findobj('tag','h_sub_1');
h2=findobj('tag','h_sub_2');
set(h1,'checked','on');
set(h2,'checked','off');

    上面的msgbox即为一个信息对话框,函数中的逗号之间分别为信息提示、标题、和图表种类。类似的还有errordlg、warndlg、helpdlg等等。这里需要指出的是如何显示多行信息,是使用单元数组cell,其形式为{'','',''}。

    导入数据的路径查找用如下程序:[FileName,PathName] = uigetfile('*.txt');pathall=strcat(PathName,FileName);这个pathall即为文件的路径。点击导入数据按钮后出现的界面如图3所示。

一个基于Matlab的简单Gui设计

图3 选择文件界面

    文件导入后即可在上面的坐标轴上画出一个无连线的神经元数据曲线(关于神经元数据做图具体见参看文献[2]),在选择连线类型中选择有次序或者无次序类型,这个选择使用弹起式菜单popupmenu,在程序中根据popupmenu的value属性进行做图。点击连线处理按钮之后出来的图像界面如图4所示。根据Color和Grid菜单处理后的界面如图5所示。

一个基于Matlab的简单Gui设计

图4 连线处理点击后界面

一个基于Matlab的简单Gui设计
图5 根据Color和Grid菜单处理后的界面

    清除图像按钮使用cla命令即可。这里有一个问题,即使用cla之后那个坐标轴数据仍然在上面,可以使用set(h_axes1,'xtick',[],'ytick',[])将坐标轴数据隐去。此外还要注意一个问题,就是对于坐标轴等设置的tag属性,在进行plot做图之后,其属性值会改变,这样就不能使用findobj找到正确的句柄了,不过在使用函数所实现的gui界面中,主函数相当于将句柄初始化了,使用首次返回的句柄即可。

    对于属性不清楚的控件,多使用get即可,设置属性使用set。还有一点我猜测的但还没有确定的,就是在对图形对象句柄的属性查看的时候,如果属性值为一个数值,一般情况下为一个图像对象,在进行处理的时候可以先将其句柄返回,再设置属性。比如x0=title('New'),set(gca,'title',x0)。

 

参考文献

[1] 罗华飞 编著.MATLAB GUI设计学习手记[M].北京:北京航空航天大学出版社,2009.

[2] 神经元房室数据做图[EB/OL].http://blog.sina.com.cn/s/blog_4b013fb10100l28h.html.[2010-10-28]. 

 

2010年10月28日晚上于njust 10系 310房间

 

CopyRight:版权所有若需转载或使用请联系作者

Email:dingqian12345@126.com 

  • 10
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值