1.我应该在哪里加我的代码?      
      MATLAB自动为你做的工作:对控件执行默认操作时,matlab自动执行按钮的callback下的代码。
      比如按钮,就是单击按钮一下。所以对于编程的新人来说,只用在相应函数下,添加自己期望执行的操作代码就可以了。比如说希望鼠标在控件上单击时执行某写代码,那将代码添加在ButtonDownFcn下就好。希望在控件销毁(比如说某窗口)时,执行一些代码,那可以把代码添加在DeleteFcn下面(常见的,“真的要退出吗”之类)。控件是否支持 “单击”,“鼠标划过”“鼠标松开”等等,可以去help查看它的Fcn有哪些。
-------------------------
      在控件上右键 选择view callbacks 就可以看见它所支持的常用的回调函数callbacks。需要对什么进行反应,直接点进去,添加自己的代码就可以了。
--------------------------
     通俗来说,都是,我怎么样一下(点一下按钮),他就怎么样一下(执行特定计算,显示一个图,跳出一个另一个界面)。再附加一些容错处理(比如说跳出一个对话框)。
即:对特定操作进行特定反应;
一个例子就是,我把slider滑块拖动,则某一个static text显示滑块的值;
要进行的特定反应是:static text显示滑块的值;----->写一句相应代码 set(handles.mystatic,'String','要显示的值')
进行的操作是: 对滑块进行拖动  ----- 所以---->把这句代码放在滑块的callback函数下

2、怎么获得和设置控件的属性

通俗的说,就是我怎么知道编辑框里的是什么,滑块现在的位置,或者pop up里选择了哪一个选项。
     而且,我怎么控制 static text显示我要求的信息
控件的属性当然远不止我刚刚说的,
设置:
     set(handles.你控件的tag,'要设置的属性名','要设置的属性值')
获取:
    get(handles.你控件的tag,'要获取的属性名')

help里可以看到所有可能有用的属性 
MATLAB->Creating Graphical User Interfaces->Laying Out GUIs and Setting Properties->What Properties Do I Need to Set?

3. 数据怎么在不同的控件之间传递

知道了GUI的数据管理规则,这个就很简单了。
-------------------    
先看在一个界面内部的数据传递   
     每一个function myc_Callback(hObject, eventdata, handles)中所传进来的参数(也就是你可以在这个callback代码中直接用这个参数)都是一样的
     第一个参数是hObject,是跟这个callback所关联的控件的handles,它的名字(Tag)叫hObject。不用管那么麻烦的概念,只用知道,控件自己的回调函数调用自己的属性,只用hObject.属性名  就可以了(中间一点)。
      第二个参数是MATLAB的保留参数
     第三个handles,是这个GUI界面的handles,它里面存放了这个界面的所有信息。所以在控件自己的回调函数中,要用别的控件的属性,就用  handles.别的控件Tag.属性  或者 handles.别的控件tag

handles格式是一个存放数据的缸。控件的handles是小缸,它的名字叫做hObject;GUI界面的handle是一个大缸,并且这个缸名字也叫做handles;大缸里存放了所有的小缸和所有用户数据,你只需 handles.控件A的tag  就可以存取控件A的信息。
     那我怎么把自己计算出或者别的什么数据放到这个缸里呢?
     ^_^ 在任何地方   handles.自己的变量名 = 某些值
     这样你就定义了自己的变量,在任何地方 b=handles.自己的变量名 就可以得到这个变量值,同样也可以修改它。
     别忘了使用
     guidata(hObject, handles);(不用改,直接黏贴)  在函数末尾来保存你对handles和hObject的操作。(不然你自定义的变量就没了)
-----------------------
      在不同GUI之间传递数据
      那就来看Open一个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就得到了传出来的结果。

Matlab GUI界面

去年做了一些关于Matlab GUI的程序,现在又要做相关的东西,回想起来,当时很多经验没有记录下来,现在回顾起来始终觉得不爽,所以从现在开始,一定要勤写记录。

从简单的例子说起吧。

创建Matlab GUI界面通常有两种方式:

1,使用 .m 文件直接动态添加控件 
 
   2.  使用 GUIDE 快速的生成GUI界面

显然第二种可视化编辑方法算更适合写大型程序。

一:创建GUI

1.在 .m文件中动态添加

例如

h_main=figure(‘name’,‘a demo of gui design’,‘menubar’,‘none’,…

'numbertitle','off','position',[100 100 300 100]);

h_edit=uicontrol('style','edit','backgroundcolor',[1 1 1],'position',[20 20 50 20],...

'tag','myedit','string','1','horizontalalignment','left');

h_but1=uicontrol('style','pushbutton','position',[20 50 50 20],'string','INC',...

'callback',['v=eval(get(h_edit,''string''));',...

'set(h_edit,''string'',int2str(v+1));']);

h_but2=uicontrol('style','pushbutton','position',[80 50 50 20],'string','DEC',...

'callback',['v=eval(get(h_edit,''string''));','set(h_edit,''string'',int2str(v-1));']);

2.使用GUIDE帮助创建GUI

在Command 里面输入 GUIDE 或者从菜单里面,或者从快捷按钮均可 进入 GUIDE

新建并且保存后,会生成相应的fig文件和m文件,在Layout编辑视图,可以使用如下工具:

Layout Editor:布局编辑器;
Alignment Tool:对齐工具;
Property Inspector:对象属性观察器;
Object Browser:对象浏览器;
Menu Editor:菜单编辑器。

二:使用控件

新建一个布局(窗口),可以在新窗口中添加如下控件

1.静态文本(Static Text)        2.编辑框(Edit Text)控件
3.列表框(Listbox)控件            4.滚动条(Slider)控件
5.按钮(Push Button)控件        6.开关按钮(Toggle Button)控件
7.单选按钮(Radio Button)控件        8.按钮组(Button Group)控件
9.检查框(Check Box)控件        10.列表框(Listbox)控件
11.弹出式菜单(Popup Menu)控件    12.坐标轴(Axes)控件
13.面板(Panel)控件

每一个控件都有自己的属性常规属性有:

一、控件风格和外观
        (1)BackgroundColor:设置控件背景颜色,使用[R G B]或颜色定义。
        (2)CData:在控件上显示的真彩色图像,使用矩阵表示。
        (3)ForegroundColor:文本颜色。
        (4)String属性:控件上的文本,以及列表框和弹出菜单的选项。
        (5)Visible:控件是否可见。

二、对象的常规信息
        (1)Enable属性: 表示此控件的使能状态,设置为on”,表示可选,为“off”时则表示不可选。
        (2)Style:控件对象类型。
        (3)Tag:控件表示(用户定义)。
        (4)TooltipString属性:提示信息显示。当鼠标指针位于此控件上时,显示提示信息。
        (5)UserData:用户指定数据。
        (6)Position:控件对象的尺寸和位置。
        (7)Units:设置控件的位置及大小的单位
        (8)有关字体的属性,如 FontAngle, FontName等。

三、控件回调函数的执行
        (1)BusyAction:处理回调函数的中断。有两种选项:即Cancel:取消中断事件,queue:排队(默认设置)。
        (2)ButtonDownFcn属性:按钮按下时的处理函数。
        (3)CallBack属性:是连接程序界面整个程序系统的实质性功能的纽带。该属性值应该为一个可以直接求值的字符串,在该对象被选中和改变时,系统将自动地对字符串进行求值。
        (4)CreateFcn:在对象产生过程中执行的回调函数。
        (5)DeleteFcn:删除对象过程中执行的回调函数。
        (6)Interruptible属性:指定当前的回调函数在执行时是否允许中断,去执行其他的函数。

四、控件当前状态信息
        (1)ListboxTop:在列表框中显示的最顶层的字符串的索引。
        (2)Max:最大值。
        (3)Min:最小值。
        (4)Value:控件的当前值。

你可以使用属性编辑器来设置属性

三:写回调函数 CallBack
每个控件都有几种回调函数,右键选中的控件一般会有如下菜单:

然后就可以跳转到相应的 Editor中编辑代码,GUIDE会自动生成 相应的函数体,函数名,名称一般是 控件 Tag+ Call类型名 参数有三个 ( hObject, eventdata, handles)

其中 hObject 为发生事件的源控件,eventdata为事件数据结构,handles为传入的对象句柄

CreateFcn 是在控件对象创建的时候发生(一般为初始化样式,颜色,初始值等)
DeleteFcn 实在空间对象被清除的时候发生
ButtonDownFcn和KeyPressFcn分别为鼠标点击和按键事件Callback

CallBack为一般回调函数,因不同的控件而已异。例如按钮被按下时发生,下拉框改变值时发生,sliderbar 拖动时发生等等。

四:句柄图形之间的层次关系

可以创建 图形句柄的常见函数

1.figure函数:创建一个新的图形对象。
2.newplot函数:做好开始画新图形对象的准备。
3.axes函数:创建坐标轴图形对象。
4.line函数:画线。
5.patch函数:填充多边形。
6.surface函数:绘制三维曲面。
7.image函数:显示图片对象。
8.uicontrol函数:生成用户控制图形对象。 
9.uimenu函数:生成图形窗口的菜单中层次菜单与下一级子菜单。

几个实用的小函数:

uigetfile  选择文件对话框
uiputfile  保存文件对话框
uisetcolor  设置颜色对话框
fontsetcolor  设置字体对话框
msgbox    消息框 
warndlg    警告框
helpdlg     消息框

不过如果要让父窗口不可用,你需要使用uiwait来定焦于用户对话框。
例如:

h=helpdlg('Please press me!','Attention');
    uiwait(h);

四:获取与设置对象属性

 常用函数:

gcf函数:获得当前图形窗口的句柄
gca函数:获得当前坐标轴的句柄
gco函数:获得当前对象的句柄
gcbo函数:获得当前正在执行调用的对象的句柄
gcbf函数:获取包括正在执行调用的对象的图形句柄
delete函数:删除句柄所对应的图形对象
findobj函数:查找具有某种属性的图形对象

设置方法:

(1)get函数返回某些对象属性的当前值。例如:

p=get(obj,'Position');

(2)函数set改变句柄图形对象属性,例如:
set(obj,'Position',vect);

五:函数调用

在一个m文件中,可以定义多个函数,但是文件名一定要与第一个函数(主函数)一致,
该文件中其他函数则为本文件的私有函数,外部不可访问(可以通过参数调用的方法访问,下面会描述)。

例如在一个程序中,创建一个fig后,会生成这样一个m文件:

function varargout =febirdfun(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @febirdfun_OpeningFcn, ...
                   'gui_OutputFcn',  @febirdfun_OutputFcn, ...
                   'gui_LayoutFcn',  [], ...
                   'gui_Callback',   []);

if nargin && ischar(varargin{1})
   gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

解析 一下这个主函数:首先 gui_State是一个结构,指定了figure打开和输出函数,

开始 gui_CallBack为空,如果输入参数个数不为0,接下来将输入第一个参数传递给gui_State.callback。

接下来用交给 gui_mainfcn函数处理,gui_mainfcn 根据gui_State和传入参数
来确定是执子函数,还是打开 fig 文件和运行 OpeningFcn和OutputFcn。

如过 gui_Callback为空,那么就运行打开主窗口fig文件,否则,调用子函数

这个函数的作用有:
1.当输入不带参数的时候,能够打开fig文件,并且初始化控件
2.当指定需要调用的函数名时,可以作为其他控件callback使用 (实则调用同文件中的子函数)
   例如,在某一个控件的 callback 里面这样写:(febrdfun为主函数)
    febirdfun("@push_button_Callback",gcbf,[])
  这样的调用就可以调用文件里面的子函数。

当然也可以使用其他文件里面的函数作为callback,不过那样的话,数据传递会麻烦一些。

下面看figure Openning Function

%================================

function Main_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
% 通常在这里面定义自己的数据结构例如

s=struct("P1",v1...
             "P2",v2);
handles.MyStruct=s; 
% 更新handles数据结构  非常重要!!
guidata(hObject, handles);

%================================
function varargout = Main_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;

这个函数是输出返回值的定义

注意:  matlab 中,function 对应的 end 可以没有,但是随着版本的更新,end将会被要求。

六:数据传递

在matlab GUI程序中进行值传递我经常使用的两种方法:

1.利用主函数 的 handles 数据结构传值

例如在某一个图像窗口句柄 中有一个对象 handles(可以定义自己的数据结构)

那么在一个子Callback函数中,可以通过handles传递数据:

function  sliderbar1_Callback(hObject,eventdata,handles)

%%  eg1

v1=get(hObject,'value');

obj=handles.Text1  %直接定位 Tag 为 Text1的控件

set(obj,'value',v1);

%%  eg2

handles.MyStruct.P1=v1; % 更改handles中的数据

guidata(hObject,handles); %更新 handles !!重要

end

2.利用控件的 UserData 来传值

每一个控件一般都有一个属于自己的自定义域,userData,你可以定义这样一个域用来保存自己的数据,例如在定义 timer 的 TimerFcn中

t1=timer('TimerFcn',{@Timer1Fcn},'ErrorFcn',@Timer1ErrorFcn},'Period',1.0,'ExecutionMode','fixedrate');

t1.Userfata=handles.MyStruct;

这里 Timer1Fcn的调用看似没有传入任何参数,实际上此函数的定义一定要有至少两个参数

function Timer1Fcn(obj,eventata)

obj.UserData=XXXXX;%可以这样共享数据
  
end

当然Timer定义的时候允许这样传递一个参数,当然这样也可以进行传值.

t1=timer('TimerFcn',{@Timer1Fcn,handles},'ErrorFcn',{@Timer1ErroFcnr,handles},'Period',1.0,'ExecutionMode','fixedrate');

学习matlab GUI编程的一点点所得相关推荐

  1. Matlab GUI编程

    Matlab GUI编程 1.在命令行窗口输入guide >>guide 2.出现下图窗口,点击确定. 3.出现ui的编辑窗口 4.和大多数UI编程软件一样,直接拉控件就行了.双击控件可出 ...

  2. c gui qt 4编程第二版_一本专门学习PyQt5 GUI编程的书

    Python作为一个开源的解释型编程软件,在教学.科研.实际项目中用得越来越多.Python易学易用,程序资源丰富,在编程解决一些科学计算问题时比较实用,但是Python自带的Tkinter包设计GU ...

  3. Matlab GUI编程技巧(三):把figure文件显示到GUI的axe上

    在matlab的GUI编程中,把figure的图像显示到GUI的axe上是非常重要的的,GUI编程下的图像显示非常常见.matlab GUI默认菜单的保存图像默认为保存全部GUI,其中包括使用&quo ...

  4. matlab转换为exe文件,matlab GUI编程及转换为独立运行的exe文件

    入门视频:https://www.bilibili.com/video/av20999810?from=search&seid=13641596054754955985 1.打开matlab ...

  5. Matlab GUI编程技巧(一):如何使gui编的界面一运行就居中

    有些时候在进行MATLAB GUI可视化界面编写时,需要将界面在运行时就处于居中状态.以下总结了两种方法: 方法一 假如当前的figure的句柄是h,则在程序运行的刚开始,用以下命令: set(h,' ...

  6. MATLAB GUI编程axes显示载入图片

    MATLAB GUI软件界面显示载入的.JPG图片分两种情况,一种是希望点击按钮后显示载入的图片.另一种情况是希望软件界面一开始就载入默认位置的图片. 启动MATLAB 2018b后,在命令行光标后输 ...

  7. MATLAB GUI编程中几个有用的程序段

    1.  启动 % 获取当前文件所在路径 currPath = fileparts(mfilename('fullpath')); % 切换工作路径到当前位置 cd(currPath); % 判断所用操 ...

  8. matlab能倒入crv文件么,[转载]matlab GUI 编程——mcc转换m文件到应用程序

    1.安装C编译器(前提是你的电脑已经安装了VC) >> mbuild -setup Please choose your compiler for building standalone ...

  9. textbox matlab,matlab gui 编程文本框更新

    本帖最后由 350954832 于 2014-12-6 07:38 编辑 我也是个新学matlab的菜鸟,有些东西也是不是特别的明白, 这个程序本来是一个界面  我想通过点击运行按钮,在左边的文本框里 ...

最新文章

  1. 分分钟甩Word几条街,Python编辑公式竟可以如此简单
  2. html支持1080p,1080p完美支持
  3. SQL 把表中字段存储的逗号隔开内容转换成列表形式
  4. codeforces 1060 A
  5. Java EE 架构设计——基于okhttp3 的网络框架设计
  6. 医药/医疗/互联网医疗服务平台/问诊/挂号/开药/处方/医生/医院/问诊订单管理/移动端问诊医疗系统/医生端处方开药系统/web端医药服务平台管理/axure原型/rp源文件/健康咨询/视频问诊/统计
  7. sap后台配置原因代码_【MM配置】Inventory Management 库存管理
  8. webpack笔记一:webpack的介绍,安装,加载css、图片、字体等
  9. python 分类变量xgboost_用于可解释机器学习的四个Python库
  10. 顶会 Best paper award 获得者分享发顶会技巧
  11. java实验报告_java实验报告完整版.pdf
  12. 两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
  13. 超标量处理器设计 姚永斌 第6章 指令解码 摘录
  14. android google GMS服务包安装
  15. 如何将Google表格电子表格插入Google文档
  16. 基于 python 的语音识别 API 调用
  17. 数据结构(C语言严版)总结
  18. 联想X260 win10 系统降级 Win7 方法
  19. 使用Eclipse创建最简单的JavaWeb网页项目
  20. 系统接口对接:(2)

热门文章

  1. 这是标题框吗?我试一下
  2. linux系统运维 pdf6,Linux系统运维之系统管理.pdf
  3. Xilinx XC7Z020双核ARM+FPGA开发板试用合集——体验ZYNQ下linux
  4. 空气净化器的原理是什么?
  5. Laya小游戏上架Oppo平台踩坑记录(持续更新)
  6. Apache Yarn重启,历史任务可以永久保留的几个参数
  7. springmvc request foward 和 redirect
  8. 快速搭建校园局域网课程点播+直播学习平台
  9. 安装完原版win7后遭遇连USB都没法使用的窘境
  10. seqkit根据基因id_fasta序列操作神器——seqkit