目录
前言上期教程按钮介绍按钮(pushbutton)如何在窗口中创建一个按钮常用属性常用属性练习回调函数的编写规则设置回调函数:定义(编写)回调函数:NoteGUI中各个回调函数之间数据的传递setappdatagetappdata方法按钮的回调函数
前言
上期教程
按钮介绍
这个按钮是GUI界面中用的最多的一个控件了,上期教程中的GUI界面中的元素
一图中列出了10个UI控件,按钮(pushbutton
)就是其中的第一个。这些UI控件的基本属性都一样,所以本期讲完了按钮的常用的属性后,后面那些按钮的属性就不详细展开讲了。
这个按钮和开关不一样,对于按钮你点一下后就会弹回原来的状态。如果是开关的话,你按一下,他会一直保持你按下之后的状态,直到你再次按下开关后才会变回原来的状态,这个开关对应的UI控件是togglebutton
(切换按钮)。
按钮(pushbutton)
如何在窗口中创建一个按钮
function main()
close all
%% 创建主窗口, 打三个点可以换行书写,一行写多了不太好
h_fig = figure('Name', 'MATLAB_GUI_教程(2)pushbutton', ...
'MenuBar', 'none', ...
'ToolBar', 'none');
%% 创建一个按钮
btn = uicontrol('Style', 'pushbutton', 'Parent', h_fig);
end
如你所见,这里是用uicontrol
函数来创建按钮的。uicontrol函数就是用来创建UI控件的,该函数返回创建出来的控件的句柄
。
UI控件的
Style
属性是用来控制UI控件的类型UI控件的
Parent
属性是用来控制该控件放在哪里(此处是直接放在主窗口中)
还记得上篇教程中说的用下面这种方式来设置控件的属性么:
btn = uicontrol('属性1', '值1', '属性2', '值2', '属性3', '值3');
我们在创建UI控件时比较习惯用这种方式来创建,当然你也可以像下面这样来创建,不过我看着比较别扭:
%% 创建一个按钮
btn = uicontrol;
btn.Parent = h_fig;
btn.Style = 'pushbutton';
上面那个创建的结果如下:
常用属性
这里常用属性这里不包括按钮的那些回调函数,回调函数那些单独说。
上面已经认识了按钮的两个属性了,其实我觉得不应该说是按钮的属性,应该说是UI控件的属性,因为这个按钮只是当UI控件的Style
属性为'pushbutton'
时的情况。
和figure一样,按钮也有很多属性,我们不可能把他们都记住,顶多记几个常用的就行了。我以前初学时连常用的都时常记不住,那怎么办呢,怎么知道它有那些属性呢,以及怎么知道相应的属性应该设置哪些值呢。其实这些在上期推送中就已经讲过了:
直接在matlab命令行中输入下面一行代码,注意不要打分号,这样可以输出有哪些属性:
btn = uicontrol
结果如下:
实际上它给我们显示出来的这些就是常用的属性,不过下面我会多添加几个:
Style:控制UI控件的类型,默认为
'pushbutton'
,在创建按钮时可以不下,但最好还是在创建时写上它。Parent:控制UI控件的父容器,通俗的说就是告诉UI控件该放在谁上面(直接的关系),目前还没讲布局,就只能直接放在figure上,当讲了布局后,这些控件都放在布局里面。虽然布局还是直接或者间接地放在figure中。为了说明按钮放在哪里,所以
这个Parent属性必须写
(虽然有时不写也行)。String:显示在按钮(UI控件)上的字符串。
Tag:按钮(UI控件)的ID,就跟我们的身份证一样。这个在GUIDE中用的多,在GUIDE中通过
handles.tag
可以获取相应的控件,在纯代码编写GUI时多用于fandobj函数。这个就不细讲了,知道存在这么个东西就好。BackgroundColor:设置按钮的背景色,可以是表示颜色的字母如:'k', 'r', 'g', 'b'等,也可以是1*3的向量,每个元素在0-1之间代表r,g,b的值。
ForegroundColor:按钮上的字符串(String)的颜色
FontSize:按钮上的字符(String)的大小
FontName:按钮上的字符(String)的字体
Visible:控制该按钮是否可见,默认是可见的
Units:控制按钮的Position的值的单位,常用像素为单位:'pixels',如果要设置单位,那么单位一定要在Position之前设置。
Position:控制按钮在窗口中的位置。以电脑屏幕为坐标平面的话,那么电脑屏幕的左下角点就是原点,position的值为:[x, y, w, h]:
实际上通常,也就用:Style, Parent, String, Units, Position, 以及后面讲的callback。如果在熟悉了 布局 之后,连Units和Position都用不上。
获取属性可以设置哪些属性值的方法还是和上期推送一样。不过在UI控件这,好多属性你这样无法获取某属性可以设置哪些值,此时就要去帮助文档中看看了:
常用属性练习
在一个窗口中放一个宽400,高100的按钮,按钮上的文字为:I'm Mith Hong。文字的颜色为红色,文字的大小为18,按钮的背景色为黑色。
function main()
close all
%% 创建主窗口
h_fig = figure('Name', 'MATLAB_GUI_教程(2)pushbutton', ...
'MenuBar', 'none', ...
'ToolBar', 'none');
%% 创建一个按钮
btn = uicontrol('Style', 'pushbutton', ...
'Parent', h_fig, ...
'String', 'I''m Mitch Hong', ...
'FontSize', 18, ...
'ForegroundColor', 'r', ...
'BackgroundColor', 'k', ...
'Units', 'pixels', ...
'Position', [50 50 400 100]);
end
结果如下:
回调函数的编写规则
设置回调函数:
uicontrol('Callback',{@btn_callback,input1,input2,…})
其中回调函数名为btn_callback,@btn_callback表示获取该回调函数的句柄;input1,input2,….为向callback中传入实际参数;把他们用大括号括起来构成一个细胞数组作为Callback的属性值。
回调函数的名字可以任意取,但是要有意义。
定义(编写)回调函数:
function btn_callback(obj,eventdata,input1,input2)
其中obj与eventdata必须要有而且顺序不能颠倒,如果函数体内用不上可以把这两个位置用 ~ 来替换掉,从第三个位置开始按顺序接受需要的输入。
obj表示当前你所点击的那个UI控件的句柄,event是一个事件,通常在uitable那用的多,这里先不解释。
不要问为什么,这是规则,记就完事了。
Note
好像在16版开始,才能在同一个m文件中写多个函数,如果是14版的,需要把回调函数单独写成一个文件!
GUI中各个回调函数之间数据的传递
setappdata
利用setappdata把数据保存到figure的appdata中:
setappdata(h_fig, 'myData1', data1)
其中data1是我们的数据,这样就能把data1保存到figure的appdata中的myData1里面了。
getappdata
利用getappdata从figure的appdata中获取数据:
data1 = getappdata(h_fig, 'myData1');
方法
因此我们只需要向各个回调函数中传递主窗口的句柄即可,这样就能在不同的回调函数中传递数据了。
另外,一般我比较习惯把数据变量的名字和appdata中的名字写成相同的,即:
setappdata(h_fig, 'data1', data1)
data1 = getappdata(h_fig, 'data1');
如果不太明白的话,看看下面的例子就明白了。
按钮的回调函数
这个在上面的回调函数的编写规则中已经讲了,这里就直接来个例子了。
例:在一个窗口中创建4个按钮,在上面标号为1,2,3,4,
点击按钮1时,隐藏按钮2,显示按钮3
点击按钮3时,隐藏按钮1,显示按钮2
点击按钮2时,显示按钮1,隐藏按钮3
点击按钮4时,都显示
function main()
close all
%% 创建主窗口
h_fig = figure('Name', 'MATLAB_GUI_教程(2)pushbutton', ...
'MenuBar', 'none', ...
'ToolBar', 'none');
%% 创建按钮
btn1 = uicontrol('Style', 'pushbutton', ...
'Parent', h_fig, ...
'String', '1', ...
'Units', 'pixels', ...
'Position', [50 50 50 50], ...
'Callback', {@callback_btn1, h_fig});
setappdata(h_fig, 'btn1', btn1); % 把btn1保存到appdata中以便于在其他回调函数中使用
btn2 = uicontrol('Style', 'pushbutton', ...
'Parent', h_fig, ...
'String', '2', ...
'Units', 'pixels', ...
'Position', [50 200 50 50], ...
'Callback', {@callback_btn2, h_fig});
setappdata(h_fig, 'btn2', btn2); % 把btn2保存到appdata中以便于在其他回调函数中使用
btn3 = uicontrol('Style', 'pushbutton', ...
'Parent', h_fig, ...
'String', '3', ...
'Units', 'pixels', ...
'Position', [200 200 50 50], ...
'Callback', {@callback_btn3, h_fig});
setappdata(h_fig, 'btn3', btn3); % 把btn3保存到appdata中以便于在其他回调函数中使用
btn4 = uicontrol('Style', 'pushbutton', ...
'Parent', h_fig, ...
'String', '4', ...
'Units', 'pixels', ...
'Position', [100 300 50 50], ...
'Callback', {@callback_btn4, h_fig});
setappdata(h_fig, 'btn4', btn4); % 把btn4保存到appdata中以便于在其他回调函数中使用
end
%% 按钮1的回调函数,obj和event我都用不上,所以用~代替
function callback_btn1(~, ~, h_fig)
% 获取2 3 按钮
btn2 = getappdata(h_fig, 'btn2');
btn3 = getappdata(h_fig, 'btn3');
% 点击按钮1时,隐藏按钮2,显示按钮3
btn2.Visible = 'off';
btn3.Visible = 'on';
end
%% 按钮2的回调函数,obj和event我都用不上,所以用~代替
function callback_btn2(~, ~, h_fig)
% 获取1 3 按钮
btn1 = getappdata(h_fig, 'btn1');
btn3 = getappdata(h_fig, 'btn3');
% 点击按钮2时,显示按钮1,隐藏按钮3
btn1.Visible = 'on';
btn3.Visible = 'off';
end
%% 按钮3的回调函数,obj和event我都用不上,所以用~代替
function callback_btn3(~, ~, h_fig)
% 获取2 1 按钮
btn2 = getappdata(h_fig, 'btn2');
btn1 = getappdata(h_fig, 'btn1');
% 点击按钮3时,隐藏按钮1,显示按钮2
btn2.Visible = 'on';
btn1.Visible = 'off';
end
%% 按钮4的回调函数,obj和event我都用不上,所以用~代替
function callback_btn4(~, ~, h_fig)
% 获取1 2 3 按钮
btn1 = getappdata(h_fig, 'btn1');
btn2 = getappdata(h_fig, 'btn2');
btn3 = getappdata(h_fig, 'btn3');
% 点击按钮4时,都显示
btn1.Visible = 'on';
btn2.Visible = 'on';
btn3.Visible = 'on';
end
结果如下: