Matlab的App Designer可以帮助我们快速编写简易的用户界面程序。本文是一个笔记,记录利用App Designer开发交互界面的一些tips。
1. 主体流程
1.1 一个最简单的DemoApp
在matlab主界面里面新建App(保存为DemoApp.mlapp),就可以进入App Designer。App Designer给我们提供了设计视图和代码视图。设计视图方便我们拖放各种控件,像按钮、文本框、坐标轴啊之类。代码视图是用来编写具体函数,按钮响应,交互逻辑之类。设计视图不用过多介绍,下面我们再看看代码视图里面的东西。
在matlab中,一个app就是一个类。我们打开代码视图,可以看到该类继承了matlab.apps.AppBase,它的主体结构如下
classdef DemoApp < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
....
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
....
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = DemoApp
...
end
% Code that executes before app deletion
function delete(app)
...
end
end
end
主要有四块
- properties:UI组建的属性。自动生成,不允许更改。
- function createComponents(app):创建UI组建的函数,自动生成,不允许更改。
- function app = DemoApp:构造函数,自动生成,不允许更改。
- function delete(app):析构函数,自动生成,不允许更改。
有了这四个部分,app类就可以顺利运行。
1.2 属性,函数,回调
属性。类似于任何面向对象语言的成员变量,我们可以再类中任何函数更改属性的值。也有私有和公共之分。
函数。这里的函数,就是普通的函数,也有私有和公共之分。
回调。回调是AppDesigner里面最重要的了,这里的回调就相当于MFC里面的响应函数,它是我们和界面交互的接口。比如我们给按钮NextButton添加了回调ValueChangedFcn,matlab会自动给我们生成一个函数:
% Value changed function: NextButton
function NextButtonValueChanged(app, event)
value = app.NextButton.Value;
end
当我们运行app时,点击了NextButton,则会进入这个函数。
2. 控件使用实例
2.1 matlab.ui.control.UIAxes
如果想在UIAxes里面画图,需要传入UIAxes的句柄给绘制图像的函数。matlab里面绘图相关函数都可以接受句柄作为第一个参数。
cla(app.UIAxes) % 清空绘图区
plot(app.UIAxes, x, y) % plot函数
hold(app.UIAxes, 'on') % hold on
axis(app.UIAxes, [-1, 1, -2, 3]) % 更改坐标轴范围
app.UIAxes.Title.String = 'demo' % 更改标题
2.2 matlab.ui.control.DropDown
下拉列表也是很常用的控件,以下是下拉列表常用的函数
value = app.demoDropDown.Value; % 拿到选中的值。默认选中第一个。
2.3 matlab.ui.control.EditField
编辑框有两种,一种是数值框,一种是文本框。它们的用法相似
value = app.EditField.Value; % 获取编辑框内的值
app.EditField.Value = value; % 设置编辑框内的值
2.4 matlab.ui.control.Label
标签框一般用来显示文本
app.demoLabel.Text = 'This is a label'; % 设置label的文字
text = app.demoLabel.Text; % 获取label的文字
3 其他涉及到用户交互的函数
3.1 文件/文件夹选择
文件选择用 uigetfile 函数,文件夹选择用 uigetdir 函数。
[filename, path] = uigetfile('*.m'); % 用户选择文件
if isequal(filename,0)
disp('User selected Cancel');
end
path = uigetdir(); % 用户选择文件夹,取消返回0
fullpath = fullfile(path, filename); % 合并成全路径
[path, name, surffix] = fileparts(fullpath); % 拆分。
当需要保存文件时,用 uiputfile 函数。另外,uisave函数可用于保存matlab变量。
3.2 弹出消息框
msgbox('Here is a message!')
3.3 输入对话框
prompt = {'Enter matrix size:','Enter colormap name:'}; % 提示
title = 'Input'; % 标题
dims = [1 35]; % 输入框尺寸
definput = {'20','hsv'}; % 默认输入
answer = inputdlg(prompt,title,dims,definput)