GUI开发的其实大同小异,无非就是消息之间传递的方式等不同,可能说的不是那么准确。最近自己有时间在看QT5开发,发现消息的传递主要是通过信号槽机制,比如多个VIEW之间同步更新的话利用到信号槽。今天发现目前项目还是需要自己写个GUI处理目前的数据,不然手动处理实在是太麻烦了,效率太低,奈何之前没写过Matlab GUI,算是学习新知识了。
数据传递
GUI界面内部的传递的数据
每一个控件的回调函数头:
function myc_Callback(hObject, eventdata, handles)
第一个参数是hObject,是跟这个callback回调函数所关联的控件的handles,在它自己的callback下,可以用代号-> hObject 来调用它。。举个例子:你当前使用了一个EDIT控件,你想获取当前的控件上显示的数字,则可以直接调用内部的属性就可以得到。不用管那么麻烦的概念,只用知道,控件自己的回调函数调用自己的属性,只用hObject.属性名 就可以了(中间一点)。 第二个参数是MATLAB的保留参数 第三个handles,是这个GUI界面的代号。可以通过它获取这个界面的所有信息。所以在控件A自己的回调函数中,要获取或者设置别的控件的属性,就用 handles.别的控件Tag.属性,跨控件数据获取
handles hObject 都是结构体。正常的编程概念。
handles格式是一个存放数据的缸。控件的handles是小缸,它的名字叫做hObject;GUI界面的handle是一个大缸,并且这个缸名字也叫做handles;大缸里存放了所有的小缸和所有用户数据,你只需 handles.控件A的tag 就可以存取控件A的信息。
figure1: 160.0011 edit1: 9.0020 uipanel1: 8.0017 popupmenu1: 7.0018 pushbutton1: 161.0011 output: 160.0011
那我怎么把自己计算出或者别的什么数据放到这个缸里呢? ^_^ 在任何地方 handles.自己的变量名 = 某些值 (其实也就是给结构体添加成员变量) 这样你就定义了自己的变量。 在任何地方 b=handles.自己的变量名 (结构名加点号来引用成员变量) 就可以得到这个变量值,同样也可以修改它。 别忘了使用
guidata(hObject, handles);//数据更新(不用改,直接黏贴) 在函数末尾来保存你对handles和hObject的操作。(不然你自定义的变量就没了)
控件callback函数体之外获取控件和用户自己的数据
function my_function(handles) % handles是GUI的handles %调用GUI内任意一控件的信息 %get(handles.你控件的tag,'要获取的属性名'); temp=get(handles.my_popup,'Value'); 计时timer中: % 在figure创建完成后创建 timer 对象,将handles传入Callback函数 t = timer('TimerFcn', {@timerCallback, handles}, 'ExecutionMode', 'fixedDelay', 'Period', 1.0); % 设置窗口关闭的回调函数 set(handles.figure1, 'DeleteFcn', {@DeleteFcn, t}); % 启动定时器 start(t); %传入handles function timerCallback(obj, event, handles) temp=get(handles.my_popup,'Value'); end % 窗口关闭的响应函数-停止计时器 function DeleteFcn(hObject, eventdata, t) stop(t); end
在其他子函数或者非figure内控件的callback内保存用户数据到guidata
在不同GUI之间传递数据
传入 那就来看打开一个GUI界面时,传给他的参数有哪些。
function mygui_OpeningFcn(hObject, eventdata, handles, varargin) 所有的启动参数都是通过varargin传到它的OpeningFcn里面的。那启动参数可以是哪些呢?
1、figure,也就是窗口参数。 比如说position之类 例如:打开这个GUI时,使用这个命令 mygui(‘Position’,[434 234 234 34])则表示打开窗口在这个位置;还有哪些可控属性可以查help。 2、自定义参数 。 如果传入的参数不是figure的属性(matlab查找不到你输入的属性名),则你输入的参数作为一个向量存放在varargin里面。 比如mygui(‘路人甲’,’80‘),那varargin{1}存放了’路人甲’,varargin{2}=’80‘
那mygui中对这读取两个数据进行反应,就达到了传入参数的目的。
传出 那怎么把数据传出来呢? 将你要输出的数据存在handles.output里面 在GUI任意地方 handles.output=数据1; handles.secend_output=数据2; 然后在GUI的outputFcn里面加上 varaginout{1}=handles.output; varaginout{2}=handles.secend_output;
这样就把数据传出来了。
看每一个GUI的最外层的那句 function varargout = mygui(varargin) 看输入输出,就是这样了。把GUI本身就是一个函数, b=mygui(一些传入的参数) 就执行GUI并返回结果 则b就得到了传出来的结果。