Matlab App Designer 实现简单程序的设计笔记 (实时更新)
问题引入
最近发现matlab的GUI界面马上就要被取消了,取而代之matlab官方弄了一个叫App Designer的东西,打开看了一下,发现截面还挺好看的,比原本的GUI好友好多了。所以做个笔记,与君共勉。
1. Matlab App Designer 的底层框架
看了一眼这个小功能提供的Demo的底层程序,发现竟然用了类的概念,这在Matlab里面还真是第一次见到。
2. APPDesigner几个基本的实现步骤
2.1 界面实现(VIEW)
在APP Designer中这是最简单的一步,说白了就是给程序搭一个空壳子,把程序将会用到的基本组件都摆放好。APPD的一个优点是,可以自动把这些组件的位置,大小和基本属性都通过可视化的交互操作提前设置好,省去了很多调试位置的时间。
但是需要需要注意的是,APPD中不允许用户改变VIEW界面实现的代码。(当然也不需要改变,因为可以做的外观改变都可以在这一步中直接通过交互式操作提前达到目的。在这个步骤中,需要注意的点大概可概括为以下几个层次:
2.1.1 结构层次
APPD中提供了非常清晰的组件结构体系,用来清楚地区分父对象和子对象,并且操作方法也非常简单,只要在当前结构层次下直接拖动组件即可达到目的。在APPD界面的最右侧可以看到组件浏览器,可以看到所有的结构层次体系。
2.1.2 常用对话框
- errordlg
- msgbox
- warndlg
- helpdlg
- dlg
dlg 作为最原始的对话框,简直原始地不能再原始了。调用命令为dialog()
。实际上dlg就是一个figure去掉menubar以后的样子,即fig=figure();set(fig,'MenuBar','none')
。如果想要在dlg上显示文字,则还需要在dlg上面添加一个“子图像句柄”,并且设置其style为text,即
fig = figure();
set(fig, 'MenuBar', 'none');
dlg = uicontrol('parent', fig, 'style', 'text');
set(dlg, ' ', '内容');
2.2 函数实现 (Model)
函数是为外部的空壳赋予内在内容的灵魂所在。函数分为两类:回调函数和辅助函数。其中辅助函数是中间处理的过程,回调函数则是空值用户与VIEW中的组件进行交互的函数。值得注意的是,所有的回调函数、辅助函数以及类成员属性,都会在APPD的最左侧代码浏览器中显示出来;特别的,如果希望删除回调函数,只能通过代码浏览器进行删除。
2.2.1 回调函数中标准形式:
- xxxChangedFcn
这类回调函数表示:在组件受到操作后时,用户希望执行的一系列操作。主要包括赋值、画图等。
- ValueChangingFcn
这类回调函数表示:在组件受到操作的同时,用户希望执行的一系列操作。一般用于slider和XX这类可以连续调节值的APPD控件。很显然,
- Table操作
在APPD中非常重要一类数据结构就是matlab中的table结构,可以直接应用于APPD中的UITable组件显示,调用方法为app.UITable.Data = tabelname
。所以在APPD中使用UITable之间我们应当先去了解以下Matlab中table结构的一些定义方法和基本操作。
- 定义方法:
可以直接通过newtable = table()
定义一个空的table结构。对table 的赋值可以且仅可以通过tablename(i,j) = cellelement
的命令实现,也就是说对table只能通过元胞数组进行赋值操作。
table_column1 = {'name01','name02','name03'}; %元胞字符串
table_column2 = {12,23,55}; %元胞数组
column_fields = {'Name','Age'}; %元胞字符串
row_fields = {'person1', 'person2'}; %元胞字符串
newtable = table(table_column1, table_column2, 'VariableNames', column_fields, ...'RowNames', row_fields);
- 基本操作:
- 创建
Table类型数据的创建有多种方法,上述方法为最基本的方法。大多数时候我们都是通过导入数据,然后将数据转化为有序的cell类型,然后直接进行table的转化。
注意:两个具有相同字段(或者说相同列数)的table类型数据可以直接通过[table1;table2]
的形式进行叠加。但是注意前提一定要是两个table具有相同的字段。同理,对于具有相同行数的table数据,可以通过[table1, table2]
的形式对其进行叠加
tbone = table({1},'VariableNames', {'var1'});
tbtwo = table({2}, 'VariableNames', {'var2'});
tbthree = table({3}, 'VariableNames', {'var1'});
%%
tbhorizontal_add = [tbone, tbtwo];
=
tablevar1 var21 2
tbvertical_add = [tbone; tbthree];
=tablevar113
%%
值得注意的是,除了可以通过table方法对表数据进行创建之外,我们对table中的数字型列还可以通过直接使用列向量的方式进行定义。定义后如果进行大括号{}
的索引,得到的将不再是cell类型的数据,而是直接变成了数值型的(double,float等)。
- 索引和截取
在table中对其元素进行索引的方法与矩阵类似,但是必须通过两个索引值来进行定位,即newtable(row1:row2,column1:end)
,其中end
代表索引至table 的末尾列。 - 根据列标签进行索引
除了可以根据坐标进行索引外,table类型的数据还可以根据column或者row的fields进行索引,例如newtable.Column1
索引得到的就是整个Column1列所构成的新Table。在table中的索引可以分为小括号()
和大括号{}
两种。其中,小括号索引结果为一个新的table类型数据;而大括号索引结果则是table内的具体数据。但是要注意的是,这个具体的数据,也是一个cell类型的数据,可能需要**再用一次大括号{}
**来索引其中具体的值。
table = filed1 field2123 'mei'234 'heng'
%%
table(1,1) = {123}; %返回值为cell
table{1,2} = 'mei'; %返回值为string的content
- 属性查看
Table类型的数据非常特殊,部分类似于结构体Struct数据,可以通过.
号进行索引。一个Table类型的数据可以通过如下方式进行索引,
table = {column1,column2,'VariableNames',cell_name}; %创建一个 新的table
table.column1_name %索引具有column1_name 列名的列
table.Properties %返回table的所有属性值
tabel.Properties.VariableNames %返回table属性值中的 字段名称 属性
table.Properties.VariableNmaes(2) = {new_columnName} %将字段中的第二个修改为新的字段,注意这里
%也只能用元胞cell进行赋值
- 属性修改
对table中的属性进行修改的主要方法有两类。第一类是通过table形式的索引(即小括号()
进行索引对元素进行修改;另一种是通过element形式的索引(即大括号{}
进行索引),如下
table = filed1 field2123 'mei'234 'heng'
%%
table(1,1) = {234}; %table形式的索引进行元素修改
table{2,1} = {'mei'}; %通过cell形式的索引进行元素修改
- 添加标签
当我们需要给某个数据打上额外的标签时,table就可以起到很大的作用。一般可以通过添加新列的方式来达到打标签的目的。 - 改变某个显示值
由于所有的显示值实际上都是属于特定的控件所形成的句柄。因此 想要达到改变某个显示值的目的,只能够先获得句柄的变量,然后直接修改句柄下该属性的值即可。用于显示的值一般数值类型的名为Value,文本类型的名为Text或者Item。 - ButtonPushedFcn
- SelectedButtonGroupFcn
在具有多个按钮可供选择(但是同时只能选取一个,不同于勾选)的按钮组控件中。
- 组件的属性
- 组件的属性之 Value vs. Items
在组件的属性中,往往会有Value,Item和Text,其中Value和Text都是显示当前的值,而Items则是显示实现设定的所有值的集合。
- Menu菜单栏操作
Menu是APPD中非常有意思的一个工具。值得注意的是,Maltab中对Menu的创建并不一定要通过代码建立,也可以通过APPD中直接点击加号,来确定不同的Menu之间的父子关系。而在代码中,我们一般可以通过指定父子parent-children关系来完成显示上的父子关系,如下
fig = uifigure();
mainMenu = uimenu('parent',fig,'string','MainMenu');
subMenu = uimenu('parent', mainMenu, 'string', 'SubMenu');
subMenu2 = uimenu('parent', mainMenu, 'string', 'SubMenu');
2.2.2 成员变量
如果希望在整个APP类的定义中都用到某个变量,就需要将其声明为私有(或者公有,但一般是私有)的成员变量。在代码视图下菜单栏中可以找到**属性+**字样的操作。
2.2.3 静态成员方法
在matlab面向对象的编程思想中,同样有着与Java和Python相类似的静态方法。静态的方法的定义格式为methods (Access = static)
,在matlab中对静态方法的调用与python中的类方法类似,而与Java中的静态方法更接近,调用方式为classname.staticmethod()
直接通过类名进行调用。同样的,由于静态方法并没有对象句柄或者类句柄,因此也就不能对任何的成员属性或者类属性进行访问。只能跟其他最一般的(非类定义)函数一样起到一定作用。
classdef name1 < meta.abcpropertyname;methods (Access = static)function show(varargin)disp('show method used')endname1.show(name) %报错
3. 程序设计进阶知识点
3.1 程序设计的一些小技巧
3.1.1 listbox的自动向下切换
在listbox中我们如果不想一直手动点击,而是希望点击一项,并且进行某种操作之后,listbox的高亮行会自动地调转到下一行。可以通过如下代码实现,
currentValue = app.ListBox.Value;
3.1.2 string数据的创建
一般我们不能通过str = ['abc', 'def']
的方式创建新的字符串数组,这样的操作会使得abc
和def
进行合并,得到'abcdef'
。而如果直接打双引号str = ["abc", "def"]
又会很麻烦,因此我们可以通过创建新的string数组,然后往里面直接放数字或者单引号字符串。
newstr = strings(5, 1);
newstr(1) = 1;
newstr(2) = 'abc';
3.1.3 判断一个由多个单一类型元素cell数据组成的cell数据中是否有某个值
当这个cell中的数据是string类型时,
newstr = strings(length(rawcell), 1);
for i = 1: length(newstr)newstr(i) = rawcell{i};
end
%%
if sum(strcmp('value', newstr)) ~= 0disp('存在该值');
elsedisp('不存在该值');
end
3.1.4 判断一个数组里面是否有某个值
if sum(array == value) ~= 0disp('存在该值');
elsedisp('不存在该值');
3.1.5 画简图
matlab中提供了快速画图工具plottools,也是一个APPD界面的具栏,可以直接创建figure和subplot,同时将数据进行拖拽即可进行画图。
3.1.6 MATLAB中的cell数组定义
在matlab中,如果通过newcell = {}; newcell(1) = [2, 3]
定义是不合法的,小括号所提供的索引只能通过cell元素进行赋值,即newcell(1) = {[2, 3]}
。除此以外,我们还可以通过大括号进行直接定义,即newcell{1} = [2, 3]
。
3.1.7 图形Figure句柄中的常用属性
axes.CurrentPoints
= 最近一次鼠标点击的2D坐标
3.1.8 画3D图形的colormap设置
Matlab App Designer 实现简单程序的设计笔记 (实时更新)相关推荐
- 用MATLAB app designer设计人机交互界面——二阶线性动态电路可视化分析的研究
用MATLAB app designer设计人机交互界面--二阶线性动态电路可视化分析的研究 这是我第一次尝试写博客,我试着给出电路课上要求的电路实验编程.但是电路的类型有点儿多,所以我只以二阶动态电 ...
- 基于Matlab App Designer的语音信号分析与处理(二):IIR和FIR滤波器的设计,语音信号的滤波
接上文:https://blog.csdn.net/weixin_53877178/article/details/122470759 目录 一.课题的任务 二.内容.步骤和要求 (1)语音信号的采集 ...
- MATLAB App Designer GUI开发从0到1(二)
文章目录 前言 一.开关以及旋钮 1. 左上角:旋钮 2.右上角:90度仪表 3.左下角:分档开关 4.右下角:开关 5.对旋钮微调 二.画图 1. 普通画图 2.添加小组件 三.回调函数 简单的回调 ...
- 《MATLAB App Designer从入门到实践》随书源代码
GUIDE已经被MATLAB抛弃了,你还不知道吗?App Designer才是发展的方向 目前市面上MATLAB GUI编程的书籍琳琅满目,但大多数是基于GUIDE开发的,MATLAB从2016年开始 ...
- Matlab APP Designer Demo
Matlab --- APP Designer Matlab APP Designer 提供了比GUIDE更加丰富的组件,两者使用方法有所不同,如下图: 然后我们开始新建一个APP Designer. ...
- 【MATLAB App Designer】实例:调用simulink模型并打包为独立程序
[MATLAB App Designer]调用simulink模型并打包为独立程序 本人第一次写文章,如有纰漏还请指出,望海涵. 本人等级不够,标签都加不了qwq,大家点点赞哈. 文章目录 [MATL ...
- MATLAB App Designer入门实战(一)
最近也是在研究MATLAB App Designer,开这样的一个系列主要是为了记录我在研究App Designer时遇到的一部分问题的解决,和一部分有趣的想法,每一篇文章会展示如何将一个项目mlap ...
- 汽车各档爬坡度曲线matlab,基于MATLAB App Designer的汽车爬坡能力建模与仿真
1. 引言 汽车常常需要在不同区域的不同道路上行驶,尤其在山区道路上,坡陡路窄,汽车必须具有一定的爬坡能力,爬坡能力通常由最大爬坡度来衡量,最大爬坡度是汽车动力性能的重要指标之一.为此开展了基于MAT ...
- Matlab App Designer 学习笔记
提示:本文的学习视频来自B站小刘老师的教程 链接:https://www.bilibili.com/video/BV16f4y147x9?from=search&seid=2070258926 ...
最新文章
- Spring Boot集成Sharding-jdbc + Mybatis-Plus实现分库分表
- TensorFlow2.0 系列开篇: Windows下GPU版本详细安装教程
- 即构推出小程序连麦直播方案,与iOSAndroid APP互通连麦!
- 宝塔linux面板php配置教程,「大商创安装」大商创X宝塔linux面板安装配置教程
- Abp vNext 后台作业hangfire
- JAVAWEB(笔记)
- linux 邮件日志,linux下如何建立邮件日志
- Unity3D占用内存太大的解决方法【先转,慢慢看】
- python机器学习库sklearn——线性回归
- .Net 接入CAS 遇到的坑
- React 事件处理函数
- 键盘迷情--Treo650 VS P50 【ZZ】
- MySQL可视化工具连不上或mysql启动不了
- 计算机在金属材料中的应用论文,浅谈金属材料在汽车轻量化中的应用论文
- iOS8 UIApplicationOpenSettingsURLString
- 双绞线传输距离_双绞线电缆施工“潜规则”
- 【魏先生搞定Python系列】一文搞定SQLAlchemy学习与使用
- Web APIs /APIs --DOM简述/DOM中获取元素方法/事件(含鼠标事件)/操作(含案例)
- “硬核”刘强东是怎么炼成的?
- java ffmpeg 海康视频流rtsp转http-flv的方式
热门文章
- C语言函数大全-- s 开头的函数(1)
- 【C】96.实现一个函数,可以旋字符串中的k个字符
- 华为魔术magic2拆机图_荣耀Magic2拆解:蝶式五轨滑屏 + 前后六摄
- 强大的chrome(1)以acfun为例抓取视频
- 低功耗基础概念——ICG(Intergrated Clock Gating)
- 标贝科技登全球语音大赛舞台Blizzard Challenge做精彩开场发言
- 关于电脑主机名更改,oracle登录不了的问题
- 使用微信同声传译,实现页面滑动播放
- ibatis 动态语句拼写心得
- 软件测试思想者 - “中华公网共图强”观后感