0


Matlab GUI编程技巧(九):详解 uitable 函数显示表格及相关操作(创建表用户界面)

  • 🔗 运行环境:Matlab
  • 🚩 撰写作者:左手の明天
  • 🥇 精选专栏:《python》
  • 🔥 推荐专栏:《算法研究》

💗 大家好🤗🤗🤗,我是左手の明天!💗

📆 最近更新:2022 年 5 月 25 日,左手の明天的第 **246 **篇原创博客

📚 更新于专栏:Matlab GUI编程技巧



🚩创建表用户界面组件:uitable

⭐️语法

  • ``````uit = uitable 在当前图窗中创建表用户界面组件,并返回 Table UI 组件对象。
  • ``````uit = uitable(Name,Value) 使用一个或多个名称-值对组参数指定表 UI 组件的属性值。
  • ``````uit = uitable(parent) 在指定的父容器中创建表。父容器可以是使用 figure 或 uifigure 函数创建的图窗,也可以是子容器(如面板)。uitable 的属性值略有不同,具体取决于该 App 是使用 figure 还是 uifigure 函数创建的。
  • ``````uit = uitable(parent,Name,Value) 指定父容器和一个或多个属性值。

⭐️

  1. ColumnWidth
  • 表列的宽度

表列的宽度,指定为

  1. 'auto'

或指定为由字符向量、字符串和数值组成的

  1. 1

×

  1. n

元胞数组。在基于

  1. uifigure

的 App 中,您还可以将列宽指定为

  1. '1x'

  1. 'fit'

  • 自动宽度 - 指定 'auto' 可让 MATLAB 使用多个因子自动计算列宽,其中一个因子是 ColumnName 属性值。
  • 根据内容调整宽度(仅限基于 uifigure 的 App)- 指定值 'fit' 可将列配置为严格调整宽度来适应列名称和数据。此设置允许比 'auto' 更窄的列。
  • 均匀宽度(仅限基于 uifigure 的 App)- 指定值 '1x' 可使所有列的宽度相同,平均分配可用空间。
  • 固定宽度 - 指定以像素为单位定义列宽的数值元胞数组。
  • 组合 - 可以在元胞数组中组合固定和可变列宽。元胞数组中的每一列对应于表中的一列。如果您指定的元胞数组中的值少于列数,则没有指定值的列将保留默认值 'auto'。如果数组中的值多于列数,MATLAB 会忽略多余的值。
  • 加权可变宽度(仅限基于 uifigure 的 App)- 指定包含字符向量或字符串的元胞数组,这些字符向量或字符串由一个数字与 'x' 串联而成(例如,'2x''3x' 等)。每列的 x 因子相对于其他列按比例设置该列的宽度,同时考虑 UI 表中的剩余空间。

**示例: **

  1. uit = uitable(uifigure,'ColumnWidth','auto','Data',[1 2 3;4 5 6])

**示例: **

  1. uit = uitable(uifigure,'ColumnWidth','fit','Data',[1 2 3;4 5 6])

**示例: **

  1. uit = uitable(uifigure,'ColumnWidth',{64,60,40},'Data',[1 2 3;4 5 6])

**示例: **

  1. uit = uitable(uifigure,'ColumnWidth',{'2x','1x','1x'},'Data',[1 2 3;4 5 6])

**示例: **

  1. uit = uitable(uifigure,'ColumnWidth',{64,"auto",40},'Data',[1 2 3;4 5 6])

**示例: **

  1. uit = uitable(uifigure,'ColumnWidth',{'fit','1x','3x'},'Data',[1 2 3;4 5 6])

⭐️

  1. Position
  • 表的位置和大小

表的位置和大小,指定为

  1. [left bottom width height]

形式的四元素向量。此表介绍该向量中的每个元素。
元素说明

  1. left

父容器的内部左边缘与表的外部左边缘之间的距离

  1. bottom

父容器的内部下边缘与表的外部下边缘之间的距离

  1. width

表的左右外部边缘之间的距离

  1. height

表的上下外部边缘之间的距离
所有测量值都采用 Units 属性指定的单位。

  1. Position

值相对于父容器的可绘制区域。可绘制区域是指容器边框内的区域,不包括装饰元素(如菜单栏或标题)所占的区域。

⭐️

  1. Units
  • 测量单位

测量单位,指定为下表中的值之一。
单位值说明

  1. 'pixels'

(默认值)
以像素为单位的距离不依赖 Windows® 和 Macintosh 系统上的系统分辨率:

  • 在 Windows 系统上,一个像素是 1/96 英寸。
  • 在 Macintosh 系统上,一个像素是 1/72 英寸。

在 Linux 系统上,一个像素的大小由系统分辨率确定。

  1. 'normalized'

这些单位依据父容器进行归一化。容器的左下角映射到

  1. (0,0)

,右上角映射到

  1. (1,1)

  1. 'inches'

英寸。

  1. 'centimeters'

厘米。

  1. 'points'

磅。1 磅等于 1/72 英寸。
推荐值为

  1. 'pixels'

,因为大多数 MATLAB App 构建功能以像素为单位测量距离。

⭐️显示表数组数据

从 R2018a 开始,可以在表 UI 组件中显示 table 数组数据。(仅当表 UI 组件位于使用 uifigure 函数创建的图窗中时,才支持此类型的数据。App 设计工具使用此类型的图窗来创建 App。)

通过调用

  1. readtable

函数从文件中读取数据来创建表数组

  1. t

。从

  1. t

中选择四个变量和 15 个行。

  1. t = readtable('patients.xls');
  2. vars = {'Age','Systolic','Diastolic','Smoker'};
  3. t = t(1:15,vars);

创建一个表 UI 组件,并将

  1. t

指定为数据。

  1. fig = uifigure;
  2. uit = uitable(fig,'Data',t);

⭐️以编程方式更新表数据

在表 UI 组件中显示并以编程方式更新 table 数组数据。(仅当表 UI 组件位于使用 uifigure 函数创建的图窗中时,才支持此类型的数据。App 设计工具使用此类型的图窗来创建 App。)

通过从文件中读入海啸数据来创建一个表数组,并在表 UI 组件中显示部分数据。

  1. t = readtable('tsunamis.xlsx');
  2. vars = {'Year','MaxHeight','Validity'};
  3. t = t(1:20,vars);
  4. fig = uifigure;
  5. uit = uitable(fig,'Data',t);

通过编辑 UI 表的

  1. Data

属性,更新第一行中发生海啸的可能性。

  1. uit.Data.Validity(1) = {'definite tsunami'};

通过访问和修改

  1. MaxHeight

列中的数据,将最大高度数据从米转换为英尺。

  1. uit.Data.MaxHeight = uit.Data.MaxHeight*3.281;

⭐️启用交互式数据编辑并实现代码响应

创建一个 App,它允许用户对表数据进行排序和编辑,并在数据发生变化时更新数据可视化。(仅当表 UI 组件位于使用 uifigure 函数创建的图窗中时,才支持交互列排序。App 设计工具使用此类型的图窗来创建 App。)

首先,创建一个名为

  1. tsunamisData.m

的程序文件。在该程序文件中:

  • 通过调用 readtable 函数创建一个 table 数组。
  • 创建一个 UI 图窗。
  • 创建一个可排序且可编辑的表 UI 组件以在图窗中显示。将 table 数组存储到该组件的 Data 属性中。
  • 创建一个气泡图来可视化海啸数据,其中气泡的坐标表示海啸的纬度和经度,气泡的大小表示海啸的最大高度。
  • 指定一个 DisplayDataChangedFcn 回调,当 App 用户在表 UI 组件中对列进行排序或编辑单元格时,该回调使用 DisplayData 属性更新气泡图。
  1. function tsunamisData
  2. % Create table array
  3. t = readtable('tsunamis.xlsx');
  4. vars = {'Latitude','Longitude','MaxHeight'};
  5. t = t(1:20,vars);
  6. % Create UI figure
  7. fig = uifigure;
  8. fig.Position(3:4) = [722 360];
  9. % Create table UI component
  10. uit = uitable(fig);
  11. uit.Data = t;
  12. uit.ColumnSortable = true;
  13. uit.ColumnEditable = [false false true];
  14. uit.Position(3) = 290;
  15. uit.DisplayDataChangedFcn = @updatePlot;
  16. % Create bubble chart
  17. ax = uiaxes(fig);
  18. ax.Position(1) = 315;
  19. ax.XLabel.String = 'Longitude';
  20. ax.YLabel.String = 'Latitude';
  21. x = t.Longitude;
  22. y = t.Latitude;
  23. sz = t.MaxHeight;
  24. bubblechart(ax,x,y,sz)
  25. % Update the bubble chart when table data changes
  26. function updatePlot(src,event)
  27. t = uit.DisplayData;
  28. x = t.Longitude;
  29. y = t.Latitude;
  30. sz = t.MaxHeight;
  31. bubblechart(ax,x,y,sz)
  32. end
  33. end

当您将鼠标悬停在标题上时,可排序的列会在标题中显示箭头。按海啸的最大高度对表进行排序。

首先双击表单元格,然后输入新高度,将第二行中海啸的最大高度编辑为 30 米。请注意观察气泡图的更新。

⭐️基于数据更改特定单元格的颜色

从 R2019b 开始,可以使用 uistyle 和 addStyle 函数为表 UI 组件的行、列或单元格设置样式。(仅当表 UI 组件位于使用

  1. uifigure

函数创建的图窗中时,才支持样式。App 设计工具使用此类型的图窗来创建 App。)

对表 UI 组件中包含缺失值的单元格设置样式。在本例中,为包含

  1. NaN

值的单元格添加红色背景色样式。

将海啸示例数据作为表数组读入工作区中。然后,创建一个表 UI 组件来显示数据。

  1. tdata = readtable('tsunamis.xlsx');
  2. vars = {'Year','Month','Day','Hour', ...
  3. 'MaxHeight','Cause','EarthquakeMagnitude'};
  4. tdata = tdata(1:100,vars);
  5. fig = uifigure('Position',[500 500 760 360]);
  6. uit = uitable(fig);
  7. uit.Position = [20 20 720 320];
  8. uit.Data = tdata;
  9. uit.RowName = 'numbered';

使用

  1. ismissing

函数获取包含缺失值的表元素的逻辑数组。找到含有

  1. NaN

值的元素的行和列下标。最后,创建一个黄色背景色样式并将它添加到表 UI 组件中包含

  1. NaN

值的单元格中。

  1. styleIndices = ismissing(tdata);
  2. [row,col] = find(styleIndices);
  3. s = uistyle('BackgroundColor',[1 0.6 0.6]);
  4. addStyle(uit,s,'cell',[row,col]);

⭐️以编程方式访问表选择

从 R2021b 开始,可以通过编程方式设置和查询选择了哪些表元素,并指定用户是否可以选择单元格、行或列。(仅当表 UI 组件位于使用

  1. uifigure

函数创建的图窗中时,才支持编程选择。App 设计工具使用此类型的图窗来创建 App。)

使用此功能,创建一个 App,当用户在表中选择数据时,该 App 会自动在地图上绘制该数据。首先,创建一个名为

  1. selectTsunamis.m

的程序文件。在该程序文件中:

  • 通过调用 readtable 函数加载海啸数据。
  • 在面板中创建一个具有表 UI 组件和地理气泡图的 UI 图窗。
  • 配置表 UI 组件。将海啸数据存储在 Data 属性中,并让用户通过设置 SelectionTypeMultiSelect 属性来选择多行。
  • 指定一个 SelectionChangedFcn 回调,当 App 用户更改表选择时,该回调会更新气泡图。该函数为每个所选行绘制一个气泡,其中气泡的大小表示最大海啸高度。
  1. function selectTsunamis
  2. % Load data
  3. T = readtable('tsunamis.xlsx');
  4. vars = {'Latitude','Longitude','MaxHeight'};
  5. T = T(1:20,vars);
  6. % Create UI components
  7. fig = uifigure('Position',[500 500 700 350]);
  8. tbl = uitable(fig,'Position',[20 20 250 300]);
  9. pnl = uipanel(fig,'Position',[285 20 400 300]);
  10. geobubble(pnl,[],[]);
  11. % Configure table
  12. tbl.Data = T;
  13. tbl.SelectionType = 'row';
  14. tbl.Multiselect = 'on';
  15. tbl.SelectionChangedFcn = @plotTsunami;
  16. % Plot tsunami data for each selected row
  17. function plotTsunami(src,event)
  18. rows = event.Selection;
  19. data = src.Data(rows,:);
  20. lat = data.Latitude;
  21. long = data.Longitude;
  22. ht = data.MaxHeight;
  23. geobubble(pnl,lat,long,ht);
  24. end
  25. end

运行

  1. selectTsunamis

函数,并通过在点击时按住 Ctrl 键来选择多个表行。该图会随海啸数据而更新。

⭐️以编程方式滚动到表行

从 R2021a 开始,可以使用 scroll 函数以编程方式滚动到表 UI 组件的行、列或单元格。(仅当表 UI 组件位于使用

  1. uifigure

函数创建的图窗中时,才支持编程滚动。App 设计工具使用此类型的图窗来创建 App。)

将样本患者数据以表数组形式读入工作区。然后,创建一个表 UI 组件来显示数据。

  1. tdata = readtable('patients.xls');
  2. vars = {'Age','Systolic','Diastolic','Smoker'};
  3. tdata = tdata(1:40,vars);
  4. fig = uifigure;
  5. uit = uitable(fig,'Data',tdata);
  6. uit.RowName = 'numbered';

滚动到表的第二十五行。

  1. scroll(uit,'row',25)

⭐️显示由数字组成的数组

创建一个显示 10×3 随机整数数组的表 UI 组件。

  1. Data

属性指定要显示的值,

  1. Position

属性指定图窗内表的位置和大小。

  1. f = figure;
  2. uit = uitable(f,'Data',randi(100,10,3),'Position',[20 20 262 204]);

⭐️显示混合数据类型

表 UI 组件支持在不同的列混合使用不同的数据类型。

创建一个空

  1. Table

UI 组件。

  1. f = figure;
  2. uit = uitable(f);

设置

  1. Data

属性以填充数据,构成一个包含不同类型的混合数据的元胞数组。然后设置

  1. Position

属性以调整表的位置和大小来适应数据。

  1. d = {'Male',52,true;'Male',40,true;'Female',25,false};
  2. uit.Data = d;
  3. uit.Position = [20 20 258 78];

设置

  1. ColumnName

属性以将列标题更改为描述性名称。将

  1. ColumnEditable

属性设置为

  1. true

,以便用户能够在 UI 中编辑数据。当用户在 UI 中更改值时,

  1. Data

属性将更新以反映所做的更改。

  1. uit.ColumnName = {'Gender','Age','Authorized'};
  2. uit.ColumnEditable = true;


🚩在图窗中创建表 UI 组件

使用

  1. uitable

函数在图窗中创建一个空的 UI 表。

  1. fig = uifigure('Position',[100 100 752 250]);
  2. uit = uitable('Parent',fig,'Position',[25 50 700 200]);

🚩创建包含混合数据类型的表

加载包含混合数据类型的样本患者数据,并将其存储在表数组中。要使数据在表组件的单元格中显示为下拉列表,请将元胞数组变量转换为分类数组。要在表 UI 组件中显示数据,请将表数组指定为

  1. Data

属性的值。

  1. load patients
  2. t = table(LastName,Age,Weight,Height,Smoker, ...
  3. SelfAssessedHealthStatus);
  4. t.SelfAssessedHealthStatus = categorical(t.SelfAssessedHealthStatus, ...
  5. {'Poor','Fair','Good','Excellent'},'Ordinal',true);
  6. uit.Data = t;


🚩自定义显示

可以通过多种方式自定义 UI 表的显示。

  • 使用 ColumnName 属性添加列标题
  1. uit.ColumnName = {'Last Name','Age','Weight', ...
  2. 'Height','Smoker','Health Status'};


点击并拖拽以移动编辑

  • 要调整列宽,请指定 ColumnWidth 属性ColumnWidth 属性是 1×N 元胞数组,其中 N 是表中的列数。设置特定的列宽,或使用 'auto' 让 MATLAB 根据内容设置宽度。
  1. uit.ColumnWidth = {'auto',75,'auto','auto','auto',100};

  • 通过将 RowName 属性设置为 'numbered',添加带编号的行标题
  1. uit.RowName = 'numbered';

  • 使用 Position 属性重新定位表并调整其大小
  1. uit.Position = [15 25 565 200];

  • 默认情况下,表 UI 组件使用隔行着色,并循环使用指定的背景颜色,直到到达表的末尾。如果将 RowStriping 属性设置为 'off',表 UI 组件将对所有行只使用在 BackgroundColor 属性中指定的第一种颜色。在此,将隔行着色保留为 'on',并为 BackgroundColor 属性设置三种不同颜色。
  1. uit.BackgroundColor = [1 1 .9; .9 .95 1;1 .5 .5];


🚩启用列排序并限制单元格值的编辑

要限制用户对表中的数据进行编辑,请设置

  1. ColumnEditable

属性。默认情况下,无法在运行的 App 中编辑数据。将某列的

  1. ColumnEditable

属性设置为

  1. true

会允许用户编辑该列中的数据。

  1. uit.ColumnEditable = [false true true true true true];

通过将

  1. ColumnSortable

属性设置为

  1. true

,使所有列可排序。如果列是可排序的,则当您将鼠标悬停在它上方时,标题中会出现箭头。

  1. uit.ColumnSortable = true;


🚩创建回调

要对表进行编程以响应用户交互,请创建一个回调函数。例如,您可以指定当 App 用户选择表的不同行、列或单元格时

  1. SelectionChangedFcn

执行命令。

此处,我们编写一个回调函数来验证

  1. Age

列中的值是否在 0 到 120 之间。创建一个名为

  1. ageCheckCB

的新函数,并将其保存到位于 MATLAB 路径上的文件夹中名为

  1. ageCheckCB

的文件中。

  1. function ageCheckCB(src,event)
  2. if (event.Indices(2) == 2 && ... % check if column 2
  3. (event.NewData < 0 || event.NewData > 120))
  4. tableData = src.Data;
  5. tableData{event.Indices(1),event.Indices(2)} = event.PreviousData;
  6. src.Data = tableData; % revert the data
  7. warning('Age must be between 0 and 120.') % warn the user
  8. end

  1. ageCheckCB

赋给

  1. CellEditCallback

属性。当用户更改单元格中的值时,回调会执行。如果用户输入的值超出可接受的范围,回调函数将返回警告,并将单元格值设置回以前的值。

  1. uit.CellEditCallback = @ageCheckCB;

🚩获取所有表属性

要查看表的所有属性,可以使用

  1. get

命令。

  1. get(uit)
  2. BackgroundColor: [3x3 double]
  3. BeingDeleted: off
  4. BusyAction: 'queue'
  5. ButtonDownFcn: ''
  6. CellEditCallback: @ageCheckCB
  7. CellSelectionCallback: ''
  8. Children: [0x0 handle]
  9. ColumnEditable: [0 1 1 1 1 1]
  10. ColumnFormat: {}
  11. ColumnName: {6x1 cell}
  12. ColumnSortable: 1
  13. ColumnWidth: {'auto' [75] 'auto' 'auto' 'auto' [100]}
  14. ContextMenu: [0x0 GraphicsPlaceholder]
  15. CreateFcn: ''
  16. Data: [100x6 table]
  17. DeleteFcn: ''
  18. DisplayData: [100x6 table]
  19. DisplayDataChangedFcn: ''
  20. Enable: 'on'
  21. Extent: [0 0 312.5000 312.5000]
  22. FontAngle: 'normal'
  23. FontName: 'Helvetica'
  24. FontSize: 12
  25. FontUnits: 'pixels'
  26. FontWeight: 'normal'
  27. ForegroundColor: [0 0 0]
  28. HandleVisibility: 'on'
  29. InnerPosition: [15 25 565 200]
  30. Interruptible: on
  31. KeyPressFcn: ''
  32. KeyReleaseFcn: ''
  33. Layout: [0x0 matlab.ui.layout.LayoutOptions]
  34. Multiselect: on
  35. OuterPosition: [15 25 565 200]
  36. Parent: [1x1 Figure]
  37. Position: [15 25 565 200]
  38. RearrangeableColumns: off
  39. RowName: 'numbered'
  40. RowStriping: on
  41. Selection: []
  42. SelectionChangedFcn: ''
  43. SelectionType: 'cell'
  44. StyleConfigurations: [0x3 table]
  45. Tag: ''
  46. Tooltip: ''
  47. Type: 'uitable'
  48. Units: 'pixels'
  49. UserData: []
  50. Visible: on

🚩应用示例

某工厂生产的桶装洗衣液,产品重量要求为3±0.05Kg。现质检部门对一批产品进行抽样检查,由3个不同的测量员分别对5桶洗衣液进行称重,称重结果见exampe.xlsx文件。请将称重结果显示在一uitable中,并绘制称重结果的图形。

  • 新建GUI,创建一个uitable,设置其Tag为Tab4(in Property Inspector)
  • Table Property Editor ‐> 设置列标题,列宽100,列设置为不可编辑状态
  • Table Property Editor -> 设置行标题,默认数字序号
  • 创建一个PushButton,修改其String为“导入测量数据”
  • 在PushButton的回调函数中读入测量数据,并显示到uitable中

  • 再次创建一个uitable,设置其Tag为Tab5
  • Table Property Editor ‐> 设置列标题,列宽100,列设置为可编辑状态
  • Table Property Editor ‐> 设置行标题为“不显示行标题”
  • MATLAB代码设置Tab5的数据
  1. set(hObject, 'Data', [2.95, 0.01, 3.05])
  • 再次创建一个PushButton,修改其String为“绘制测量数据”
  • 创建一个axe控件,用于测量数据图形的显示
  • 在PushButton的回调函数中绘制测量数据,并添加重量的上下限值

  • 设置不同的上下限值,查看绘图效果


⭐️⭐️⭐️⭐️⭐️

🌟全文共9930个字,码字总结不易,老铁们来个三连:点赞、关注、评论🌟

🌟作者:左手の明天🌟

🌟原创不易,转载请联系作者并注明出处🌟


本文转载自: https://blog.csdn.net/ywsydwsbn/article/details/124967942
版权归原作者 左手の明天 所有, 如有侵权,请联系我们删除。

“Matlab GUI编程技巧(九):详解 uitable 函数显示表格及相关操作(创建表用户界面)”的评论:

还没有评论