当我们学习c++ MFC的时候,总会看到界面,所以当在用Matlab的时候也想用GUI,这里首先写一点关于GUI界面的一些基础的操作,基本包括了不同的控件的使用,也会给很多的小例子,同时主要是对爱生活,爱网络,爱MATLAB~这个大神的视频的记录,不过真很好,所以就把过程写下来,让更多想入门GUI的有点帮助,当然这篇文章 主要的是基础的应用,后面也做出类似图像处理的GUI界面。整体代码工程在我的资源里面可以下载,下面也会给出分步代码创建可以用来理解、练习。http://download.csdn.net/detail/qq_20823641/9486571
本文主要从三个方面
为了不太长就绘制了一个总图,图像结果包括下面的所有的操作,希望看完以后大家可以自己动手去建立一下,很有意思,也会给图像处理GUI打下基础,相应的代码和文件会上传到csdn的资源,,找不到也可以QQ。
下面介绍的是具体的操作,注意在做的时候,一定要先看看上图中,你想要画的是什么,然后找控件,再定义回调函数。
1 打开GUI
直接输入guide或者选择打开Matlab 新建Gui File--New--GUI guide出现如下窗口 可点击Blank GUI,出现布局窗口,同时注意
openexisting GUI,如果你关闭了GUI页面可以从这个选型恢复,和运行.m出来是不一样的。
随便画一个控件,保存文件会生成2个文件,一个是fig,里面包含了你设计的控件,还有一个是m文件,里面是所有空间的函数
双击刚才绘制的按钮,就可以对他的属性进行修改,例如stype就修改就会改变控件的类型从按钮可以编程text等,
有了空间就要给定义,实现他的功能,这里就要编写他的回调函数,对着控件右击看到view callbacks callback回调函数
2 创建一个文本传递的GUI
Guide,添加一个edittext , 双击修改属性 ,fontsize可以修改字体的大小,string显示的内容 ,tag会对应先后顺序,复制一个edit text 然后加入一个botton,右击它编写他的回调函数
<pre name="code" class="html"> function pushbutton1_Callback(hObject, eventdata, handles) str=get(handles.edit1,'String');%得到edit1中的字符 set(handles.edit2,'String',str);%edit2中的字符得到str
<span style="text-align: center; background-color: rgb(240, 240, 240);"> </span><span style="font-size:18px; text-align: center; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">图像结果在上面的图中。</span>
3 例如设置GUI窗口大小可以调
在GUI.fig图形设置中,在菜单栏选择tools-GUIoptions-resizebehavior 选择proportional
4 例如滚动条数值显示在文本框中
需要一个滚动条slider,双击看属性,里面有MAX MIN滑动范围 还有Tag value string,还有一个static text 双击属性string fontsize,再来一个edit text
右击滚动条slider,定义回调函数
functionslider1_Callback(hObject, eventdata, handles)
var=get(handles.slider1,'value');%得到滚动条中value set(handles.edit3,'String',num2str(var));%编辑框得到数值,此处需要把数值型转化成字符型5 例如radio button check box和toggle button的基本用法
添加一个radio button 双击属性 max min 选中按钮 显示最大值 取消选中显示最小值 value tag(radiobutton1改成kj1), string删除不显示注意如果你的max 10 min -1 而value还是0就会出错,因为显示的要么是最小要么是做大,所以要改变value为-1,添加一个edit text 其中Tag改成kj1,右击radio button进行回调函数定义
functionkj1_Callback(hObject, eventdata, handles) var=get(handles.kj1,'value'); set(handles.kj2,'string',num2str(var))
添加一个 check box 双击查看属性 max min 和value要对应,tag中改成kj3,添加一个edit text 修改 string tag为kj4
编辑check box的回调函数
functionkj3_Callback(hObject, eventdata, handles) var=get(handles.kj3,'value'); set(handles.kj4,'string',num2str(var))
最后添加一个toggle button,max min value,tag改成kj5,添加一个edit,其中tag改成kj6
编辑toggle button的回调函数
functionkj5_Callback(hObject, eventdata, handles) var=get(handles.kj5,'value'); set(handles.kj6,'string',num2str(var));
6 例如button group 绘制不同的正弦曲线
首先创建一个button group控件,双击属性,title修改成绘制不同正弦曲线,然后创建3个radio button 在group中,第一个string改成sin(x) tag改成kj7,第二个string改成cos (x) tag改成kj8, 第三个string改成sin(x)+cos(x )tag改成kj9,注在group中的按钮只能有一个被选中,添加一个坐标轴按钮axes,右击button group进行回调函数,此处view 然后callbacks------selectionchangefcn
functionuipanel1_SelectionChangeFcn(hObject, eventdata, handles)%选择发生变换 x=0:0.01:2*pi; current_Obj=get(eventdata.NewValue,'Tag');%当前选择的控件,结构体,当选被选择的控件的Tag,得到当前被选中的radio button的tag,赋值给current_Obj %绘制前要选择当前的坐标系,查看tag axes(handles.axes1) switchcurrent_Obj%判断哪一个radio button被选中 case 'kj7' y=sin(x); plot(x,y); case 'kj8' y=cos(x); plot(x,y); case 'kj9' y=sin(x)+cos(x); plot(x,y); end
7 例如下拉菜单pop up menu的基本用法
首先创建一个 pop up按钮,双击查看属性 string 输入三个函数 ,tag改成kj10,此处的value对应可以下1或者2或者3,对应显示的string的三个函数中的其中一个
创建一个axes坐标系控件, 定义回调函数
% --- Executes on selection change in kj10. function kj10_Callback(hObject, eventdata, handles) % hObject handle to kj10 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: contents = cellstr(get(hObject,'String')) returns kj10 contents as cell array % contents{get(hObject,'Value')} returns selected item from kj10 var=get(handles.kj10,'value');%得到下拉菜单空间的value值,以便确定点击的是控件的哪一行 x=0:0.01:2*pi; axes(handles.axes2) switch var case 1 y=sin(x); plot(x,y); case 2 y=cos(x); plot(x,y); case 3 y=sin(x)+cos(x); plot(x,y); end
8 例如listbox的基本用法
创建一个listbox控件,双击属性string添加四行 1 sin(x) cos(x) sin(x)+cos(x),其中value的数值对应string中的行
创建一个push button控件,string中修改为选择x轴参数,同样建立一个选择y轴参数的控件,再分别对应2个edit控件
首先对push button X控件进行定义回调函数
functionpushbutton2_Callback(hObject, eventdata, handles)
selected_index=get(handles.listbox1,'value');
str=get(handles.listbox1,'string');
set(handles.edit7,'string',str{selected_index});
首先对push button X控件进行定义回调函数
functionpushbutton2_Callback(hObject, eventdata, handles)
selected_index=get(handles.listbox1,'value');
str=get(handles.listbox1,'string');
set(handles.edit8,'string',str{selected_index});
然后仅需listbox的view callbacks creatfcn
functionlistbox1_CreateFcn(hObject, eventdata, handles)
。。。。。。。。
添加
t=0:0.01:2*pi;
canshu1=t;
canshu2=sin(t);
canshu3=cos(t);
canshu4=sin(t)+cos(t);
CS={canshu1,canshu2,canshu3,canshu4};
handles.CS=CS;
guidata(hObject,handles)%保存和更新handles结构体再在选择X参数控件右击定义回调函数
分别对选择X参数和选择Y参数2个空间进行回调函数添加下面三行代码
x=handles.CS{selected_index};
handles.x=x;
guidata(hObject,handles);
、、、、、、
y=handles.CS{selected_index};
handles.y=y;
guidata(hObject,handles);
添加一个绘图曲线的push button
创建一个坐标系axes
对绘制曲线的控件进行回调函数
functionpushbutton4_Callback(hObject, eventdata, handles)
axes(handles.axes3)
plot(handles.x,handles.y)
axisequal
9 例如 菜单控件menu的基本用法
点击menu editor -menu bar(菜单栏)(context menus是右击显示的菜单)
新建一个new menu label改成绘图
在new menu下新建2个菜单(注点击图像菜单上左边第一个图标是新建菜单,左边第二个是新建子菜单),把2个子菜单lable tag分别改成正弦曲线sinx 余弦曲线 cosx
然后创建一个坐标系控件axes,然后再次进入menu editor,对正弦曲线进行回调函数编辑,此处先点击子菜单正弦曲线,然后点击view进去编辑
functionsinx_Callback(hObject, eventdata, handles)
x=0:0.01:2*pi;
y=sin(x);
axes(handles.axes4)
h=plot(x,y);
handles.h=h;
guidata(hObject,handles)
同样的方法进行余弦,区别就是在回调函数,y=sin(x)变成了y=cos(x)
下面来定义一个弹出菜单,就是右击的时候显示的菜单
首先要选择menu editor下的context menus,然后新建一个菜单(左边第三个图标),lable改成line,然后再建立line子菜单,lable改成颜色,然后再建立颜色的子菜单三个,lable tag 分别改成红色 red 绿色green 黑色 black
再建立一个line的子菜单,lable改成线宽,tag改成xiankuan,然后线宽下再建立三个子菜单,lable tag 分别改成线宽1 xiankuan_1 线宽2 xiankuan_2 线宽3 xiankuan_3
想要右击出来菜单还要做一步
双击坐标轴4,找到一个属性叫做UIContextMenu,下拉选择我们定义的Line
这样就可以右击显示菜单了,但是功能不能使用,还要做
点击menu editor 点击contex menus分别进行点击view然后定义回调函数,就是分别在自己的回调函数内添加相应的函数,一个是一行
set(handles.h,'color','r');%红色
set(handles.h,'color','g');%绿色
set(handles.h,'color','k');%黑色
同样的方法进行线宽的回调函数
set(handles.h,'LineWidth',1);
set(handles.h,'LineWidth',2);
set(handles.h,'LineWidth',3);