• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

Matlab-GUI开发基础

Matlab admin 4年前 (2016-04-20) 2161次浏览 0个评论 扫描二维码

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 的信息。

GUIDE 创建了一个大缸:结构体 handles,handles 包括了 figure 中所有控件的句柄,也包括 figure 的句柄
比如一个 GUI 包括一个 edit text, 一个 panel,一个 pop-up menu 和一个 push button,GUIDE 用每个控件的 tag 来命名 handle,handles 结构体内容如下:
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 的操作。(不然你自定义的变量就没了)
%guidata( 视窗句柄 , 全部句柄 ),如果视窗句柄位置不是视窗句柄,而是一个控件的句柄,那么这个控件的父视窗(parent figure)会被调用。所以 guidata 中的视窗句柄 可以是 figure 的句柄,也可以是 figure 内所包含的控件的句柄,不管是哪种情况,最终 handles 会和 figure 相关联。全部句柄即 GUI 句柄 handles

控件 callback 函数体之外获取控件和用户自己的数据

    GUI 界面的 handles 保存着所有控件的信息以及用户自己的数据,所以只要获取 GUI 的 handles 就可以获取所有。
    比如在自己定义的函数里获取 handles,只需将 handles 作为参数传进去就可以
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

GUIDE 中, GUIDE 生成了一个包括所有 GUI 句柄的结构体:handles,我们可以保存用户数据到其中(GUIDE generates a handles structure that contains the GUI’s handles. You can add your own data to it)
   guidata( 视窗句柄 , 全部句柄 )
如果视窗句柄位置不是视窗句柄,而是一个控件的句柄,那么这个控件的父视窗(parent figure)会被调用。所以 guidata 中的视窗句柄 可以是 figure 的句柄,也可以是 figure 内所包含的控件的句柄,不管是哪种情况,最终 handles 会和 figure 相关联。全部句柄即 GUI 句柄 handles
   guidata(hObject, handles);
在 figure 控件 callback 之内调用 guidata(hObject, handles);,hObject 是控件的句柄。如果在其他子函数或者非 figure 控件的 callback 知中使用 guidata 保存数据,hObject 就不再是控件句柄,会出错。所以我们要用 figure 的句柄代替 hObject,即 handles.figure1
guidata( handles.figure1 , handles);
例如在上述计时器的 callback 函数中保存 data: guidata( handles.figure1 , handles);

在不同 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 就得到了传出来的结果。


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Matlab-GUI 开发基础
喜欢 (1)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!