版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MATLAB中GUI设计领悟GUI设计摘要对MATLAB GUI设计的一些领悟,针对数据传递做了一些介绍BagginsMATLAB中GUI设计领悟目录背景介绍1.GUI 介绍.1.前台2.后台2.初步实施3.数据传递介绍 4.GUI间主子结构传递 4.输入参数传递varain4.返回参数的设置 varaout5.global全局变量传递6GUI 内 UserData传递.6appdataW 递 8.(I)getappdata® 数.8(2)setappdatc® 数8(3)rmappdata8.handles和 GUIdata 传递910ad加载传递.10总结10关键词:M
2、ATLAB、GUI、GUIDE、数据传递背景介绍最近在给宝钢做一个基于 MATLAB平台的操作界面,用到了 有关GUI的东西。为此特地学习了一下有关知识,在论坛里逛来逛 去,也没有发现非常有价值的东西,反而让自己更加的郁闷和烦 乱,后来又狠下心来耐心的看了 MATLAB的帮助文件,终于有所 收获,特记录在案,以备查阅!GUI介绍何谓界面?界面就像 windows,就像mac,和操作系统一样, 界面就是用于被我们操作而且又不用编程的东西。做界面,学GUI要知道你要做什么才能真正明白自己的思路。首先,GUI中GUIDE就是能够把前台和后台分开来编辑的东 西。所谓前台就是给啥也不懂的人做的,他啥也不
3、用知道,只需要 根据要求把数据输入,在前台上乱输一顿,最后一点击出来想要的 东西就哦了的东西。所谓后台,就是给那些懂点的人做的,万一哪 天你搞的界面坏了,总要有人来修吧,咋修?就要看后台的程序 了。做GUI前,我们大都知道自己想要的界面长的啥样,那就是你 的前台;后面我们就想啦,这前面的数该咋运算呀?那就是你后 台。前台其次,搞明白前台。搞明白,说起来容易做起来难。那就需要 你把你要搞的项目大卸八块,比如我做某某系统的仿真。要明白至 少以下几点:.做什么系统。光仿真了,什么系统都不知道,仿啥呀仿。(2) .多少个模块。你的系统有多少个模块串起来的?这关系到你 做GUI的界面的多少(3) .多少
4、参量。数一数,最好要把系统的原理和方框图搞明白了(4) .仿真什么。要明白自己要仿什么东西,结果是咋样的(5) .考虑要用到GUI中的什么元件(6) .分多少个界面把系统都包括了(7) .要用你开发的界面的家伙用的电脑的分辨率。万一人家屏幕 是800, 600的你搞一个1280的给人家,不够拖鼠标的。后台然后,搞明白后台。后台要明白实在是太困难了,还没做呢就 想搞明白估计要去上培训班了。你就要说了,妈的,老子这俩月就 要整出来,哪有空上课去呀。对了,现在都讲究速成,呵呵!哥们 也是这样。这里边搞明白是说了解,不过你要是真搞通了更好。了解些什么呢?要了解前台那些元件都是跟谁连在一起的?在这里我稍
5、微介绍一点。其实每一个 GUI界面都会产生一个M文件,这个文 件里面从一产生就会有几个大的功能,不细说,只有两个比较有用 就是openfcn和outputfcn,前面那个是在一打开界面就执行的东 西,后面那个事关闭的时候才执行的东西。这两个主要是实现预操 作和数据输出用的。还有,你每添加一个元件在前台,后台就会产 生相应的函数。你自己对比一下就知道了初步实施好了,前期工作都准备完了,那我们就开始搞.按照自己的想法先把界面先弄好,就是先把前台弄出来。会 摆积木么?会就能搞定这一步。无非就是从功能框里托出来 放在自己看着顺眼的地方。.想想自己想在那个东西上加些东西,让别人一点击立马有程序运行。想好
6、了以后就在那个元件上右键找 callback,打开的 是后台函数文件,把你要实现的功能写在里面。怎么编函数 自己去学吧。(3) .前台后台都写完了,封装一下,你的东西就搞完了。这里边有一个非常巨大的问题,那就是数据传递的问题。这个 界面的数据想也能在另外一个界面用。这个问题是在是个大问题, 因为GUI就三个问题,一个是前台设计,一个是后台编程,然后就是这个问题了,它主要是负责前台和后台,后台和后台,前台和前 台串联的东西。没有它你整的那玩意儿就啥也不是。数据传递介绍说了半天到底咋传递呀!下面系统的介绍一个数据传递的问 题论坛里有大哥总结是这样的:GUI间主子结构传递运用GUI本身的varain
7、、varaout传递参数(注:这种方式 仅适用与GUI间传递数据,且只适合与主子结构,及从主GUI调用 子GUI,然后关掉子GUI,而不适合递进结构,即一步一步实现的 方式)。输入参数传递 varain比如子GUI的名称为subGUI,设想的参数输入输出为:outl, out2 = subGUI(in1, in2)在subGUI的m文件中(由GUIDE自动产生):1 .第一行的形式为: function varargout = subGUI(varargin)该行不用做任何修改;varargin和varargout分别是一个可变长 度的cell数组(MATLAB帮助文件中有说明)。输入参数in
8、i和in2保 存在varargin中,输出参数 outl, out2包含在varargout中;2 .在subGUI的OpeningFcn中,读入参数,并用 GUIdata保存, 即:handles.ini = varargin1;handles.in2 = varargin2;GUIdata(hObject, handles);返回参数的设置 varaout1 .在GUI子程序的OpeningFcn函数的结尾加上 uiwait(handles.figurel); figurel 是 subGUI 的 Tag;2 . subGUI中控制程序结束(如"OK"和"Ca
9、ncel"按钮)的 callback 末尾加上 uiresume(handles.figurel)不要将 delete命令放在 这些callback中;3 .在子GUI的OutputFcn中设置要传递出去的参数,如 varargout1 = handles.outl; varargout2 = handles.out2;末尾添力口 delete(handles.figurel);结束程序。在GUI的OpenFcn中,如果不加uiwait,程序会直接运行到下 面,执行OutputFcn。也就是说程序一运行,返回值就确定了,再在 其它部分对handles.output作更改也没有效果了。
10、加上uiwait后,只有执行了 uiresume后,才会继续执行到 OutputFcn,在此之前用户有充分的时间设置返回值。通过以上设置以后,就可以通过 outl, out2 = subGUI(in1, in2) 的形式调用该子程序。在一个GUI中调用另一个GUI时,主GUI不需要特别的设 置,同调用普通的函数一样。在打开子 GUI界面的同时,主程序还 可以响应其它的控件。不需要担心子 GUI的返回值被传错了地方。global全局变量传递运用global定义全局变量传递参数(适用于 GUI内控件间以及 不同GUI间)这种方式恐怕是最简单的方式,是很省心!但是但是,简单的 问题就在于有时你会很头
11、疼!因为在每一个要到该全局变量的地 方,你都要添一句gloal x,还有就是如果你在一个地方修改了x的值,那么所有x的值就都变了!有的时候恐怕会出现紊乱。 另一个更重要的问题在于,套用 C+的一句话,全局变量破坏了程 序的封装性!所以,全局变量是能少用尽量少用。GUI 内 UserData 传递直接通过对象的userdata属性进彳f各个callback之间的数据存取 操作。首先必须将数据存储到一个特定的对象中,假设对象的句柄 值为ui_handle,需要存储的值为value,则输入以下程序即可:set('ui_handle','UserData',Value)
12、;此时,value数据就存在句柄值为ui_handle的对象内,在执行 的过程中若要取回变量可以通过以下方式在任意 callback中获取该 数据值:value=get(''ui_handle,'UserData');虽然使用这种方法简单,但是每个对象仅能存取一个变量值, 因此当同一对象存储两次变量时,先前的变量值就会被覆盖掉,因 此都用UserData存储简单与单一的数据。如下面有两个GUI函数, myloadfn加载mydata.mat文件,该文件内存储 XYData变量,其值 为m*2的绘图矩阵,加载后将该变量值存储到当前的窗口的 UserData属性中。
13、另一个 myplotfcn函数则是用以获取该 UserData 属性中存取的绘图数据,然后绘图。代码如下:function myloadfcnload mydata;set(gcbf,'UserData',XYdata)function myplotfcnXYdata=get(gcbf,'UserData');x=XYData(:,1);y=XYData(:,2);plot(x,y);appdata 传递应用 setappdatagetappdatcf rmappdata函数(GUI 间和 GUI 内, 推荐使用)使用上面三个函数最有弹性处理数据的传送问题,与U
14、serData 的方式相类似,但是克服 UserData的缺点,使一个对象能存取多个 变量值。(l)getappdata 函数VALUE =getappdata(H,NAME)(2)setappdata 函数setappdata(H,NAME,VALUE)(3)rmappdatarmappdata(H,NAME)首先在matlab命令窗口输入magic(3)数据,因此当前的工作空 间就存储了 magic(3)这组数据了,然后建立一个按钮来获取并显示 magic(3)数据>>A=magic(3);>>setappdata(gcf,'A','A
15、9;);%save>>uicontrol(' St品不矩阵'A','callback','A=getappdata(gcf,'A')');当在主子GUI内调用时,可以如下设置fig1调用fig2时,使用fig2指令来打开fig2,在fig2的m文件中,在回调函数中用 setappdata(fig1,'A',A)实现 返回fig1 ,并将参数A传递给fig1然后在fig1的使用A的地方添加 A=getappdata (fig1 ,'与。但这种方式的一个问题就是每调用一次,fig1的数据就得
16、初始 化一次,这是因为setappdata(fig1,'A',A)中出现了 fig1 ,调用一次 setappdat新得运彳f一次fig1的缘故,解决方案就是把setappdata(fig1,'A',A)改为 setappdata(0,'A',A),这 1巴 A 读入 matlab workspace,相当于一个全局变量了,但当然比直接用 global定义全 局变量好!handles 和 GUIdata 传递结合handles和GUIdata函数(GUI内,不推荐使用,经常出现 问题,比如在handles中添加了变量对象Y后可能就会挤掉handl
17、es 另外一个对象)他的使用格式如下,如果你在 pushbuttonl中得到一个变量X, 相传出去,那么在 pushbuttonl的callback中,在得到X后添加如下 代码:handles.X=X;GUIdata(hObject,handles)注意,一定是两行连写)在pushbutton2中要用到X是,在其callback先添 加X=handles.X;即可得到X的值。load加载传递运用save和load (importdata)传递参数(GUI内和GUI间)将某变量x的值先存到磁盘,用的时候在调用。格式如下: save('*mat','x');用的日t
18、候就用10ad('*mat'),但这样只是把x读到了 matlab workspace不会用显示,你还要再去查看这个变量名,然后 才能用,建议使用p=importdata('*mat'),p是一个结构体,可以随意 使用了。当然,这种方式涉及到磁盘读写,速度当然会有影响的, 一般情况不用,通常用在保存以及导入某个变量时!总结个人觉得很乱,其实最实用的只有几个,那就是 save 10ad跟 varargin两个。下面解释一下.你的东西如果是个工程,很多界面,又要跟外界有数据交 流,作为整体来看,你就要读取数据,那就要用到saveload。还有这些界面之间的操作都是基于工作空间里的数据 的,比如你有三个界面a b c,你想在a里面调用c的东西, 可是c就没打开过,那c的数据就没有进入到工作空间中, 也就是没有,你用上面的什么也好就是俩字,没用。对了, 说错了,上面那哥们有个setappdata
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 挤压模拟课程设计
- 银行支行的行政后勤工作综述
- 宠物服务员工作总结
- 港口货物装卸合同三篇
- 三年级科学学科的教学工作总结
- 门诊护士年终总结
- 【八年级下册历史】期中达标测试卷
- 2024年统计员年终工作总结篇
- 2024-2025学年北京门头沟区 初三(上)期末物物理试卷(含答案)
- 分包采购委托合同(2篇)
- 《机修工基础培训》课件
- 品质黄焖鸡加盟活动策划
- DLT 754-2013 母线焊接技术规程
- 设立数字经济产业园公司商业计划书
- 部编版小学道德与法治五年级上册单元复习课件(全册)
- 仙桃市仙桃市2023-2024学年七年级上学期期末数学检测卷(含答案)
- 智慧农场整体建设实施方案
- 航空公司个人年终总结(共12篇)
- 产品供货方案、售后服务方案
- 苏教版小学数学六年级上册第4单元解决问题的策略重难点练习【含答案】
- 安徽省池州市贵池区2023-2024学年高二数学第一学期期末综合测试模拟试题含解析
评论
0/150
提交评论