引子
本人在使用MATLAB GUI完成毕业设计时碰到表格(uitable)的使用问题,需要实现对既有表格的增加删除功能,参考网上大神的代码有略微报错,分享自己的修改和实现思路。
参考
MATLAB GUI表格(uitable)的增删操作
Matlab GUI控件之——uitable
表格创建
本程序的界面如下图所示
1) 公共变量soil_setting
为了储存表格内的数据,程序设置了公共变量soil_setting
global soil_setting;
%soil_setting为地层参数变量
2)程序所需的表格(uitable)的回调函数
本程序表格的命名(tag)为utab_soil
查看回调函数
①打开.fig文件(在命令行中输入guide+文件名)
②通过右击控件(表格uitable)—查看回调(View Callback)—
即可查看表格的回调函数
表格回调函数的修改
本程序对uitable的CreateFcn与CellSelectionCallback进行了修改
在回调函数中依次打开上述两个回调函数,设置代码如下
function utab_soil_CreateFcn(hObject, eventdata, handles)
handles.hangIndex = -1;
%将行索引值设置为默认值-1,表示现在处于未选择状态
guidata(hObject, handles); %更新结构体
function utab_soil_CellSelectionCallback(hObject, eventdata, handles)
hang = eventdata.Indices; %获取行索引
if isempty(hang)==0 %若行索引不为空,表示用户选中表格中的某项
hangIndex = hang(1,1); %行索引赋值
handles.hangIndex = hangIndex; %把行索引添加到结构体
guidata(hObject, handles); %更新结构体
else
handles.hangIndex = -1;
%将行索引值设置为默认值-1,表示现在处于未选择状态
guidata(hObject, handles); %更新结构体
end
按钮
如上图所示,本程序通过三个按钮“插入”“删除”和“清除”分别实现对应的功能
按钮命名(tag)分别为btn_Add 、btn_Del 和btn_Clc
对三个按钮的Callback 回调函数进行了编写
1) btn_Add 的Callback回调函数
点击插入按钮,弹出窗口提示用户插入数据,若表格内无数据或用户未选中任何数据,则在最下方插入数据;若用户选中一条数据,则在表格中间插入数据。
代码如下:
function btn_Add_Callback(hObject, eventdata, handles)
global soil_setting; %声明global变量管理表格内容
prompt ={'土层名称','层厚(m)','重度(kN/m3)'}; %对话框内容提示
title = '请输入数据'; %对话框标题
lines = [1 40;1 40;1 40]; %设置输入框行数 为了显示标题这里要将行数改大一点
def = { '填土','2.5','18.5'}; %默认值
hangIndex = handles.hangIndex; %获取选择以后传入的行索引
%注意:若在uitable的CreateFcn函数中不将handles.hangIndex设置为-1,
%则在soil_setting内容为空,需为表格添加第一条数据时,上述代码会报错,提示不存在handles.hangIndex
if hangIndex==-1 %读取到hangIndex为-1,说明表格中无数据或用户未选中任何一行
%将数据增加在soil_setting的最后一行 通过对话框输入
tab = inputdlg(prompt,title,lines,def); %对话框设置
newrow1 = tab{1}; %对话框第一行内容
newrow2 = str2num(tab{2}); %对话框第二行内容
newrow3 = str2num(tab{3}); %对话框第三行内容
newArray = {newrow1, newrow2, newrow3}; %保存在新的矩阵中
oldData = get(handles.utab_soil,'Data'); %保存原来的数据
soil_setting=[oldData;newArray];
set(handles.utab_soil,'Data',soil_setting); %显示到表格中
else %表示用户已选中某行 则实现插入数据至表格中间的操作
tab = inputdlg(prompt,title,lines,def); %对话框设置
newrow1 = tab{1}; %对话框第一行内容
newrow2 = str2num(tab{2}); %对话框第二行内容
newrow3 = str2num(tab{3}); %对话框第三行内容
newArray = {newrow1, newrow2, newrow3}; %保存在新的矩阵中
oldData = get(handles.utab_soil,'Data'); %保存原来的数据
soil_setting=[oldData(1:hangIndex,:);newArray;oldData(hangIndex+1:length(oldData),:)];
%插入数据至表格中间
set(handles.utab_soil,'Data',soil_setting); %显示到表格中
end
2) btn_Del 的Callback回调函数
若用户未选中表格的内容,则程序警告,若用户选中某项,则删除。
代码如下:
function btn_Del_Callback(hObject, eventdata, handles)
global soil_setting;
hangIndex = handles.hangIndex; %获取选择以后传入的行索引
if hangIndex==-1
warndlg('未选中行,无法删除。请选中一行再点击删除','警告');
else
soil_setting(hangIndex,:) = []; %删除选中的某行数据
set(handles.utab_soil,'Data',soil_setting); %显示到表格中
end
3) btn_Clc 的Callback回调函数
若用户执意清空,则清空。
代码如下:
function btn_Clc_Callback(hObject, eventdata, handles)
global soil_setting;
button=questdlg('你确定清除表格内容吗?','警告','是','否','否'); %内容,标题,选项,默认选项
if strcmp(button,'是')
soil_setting(:,:) = []; %删除全部
set(handles.utab_soil,'Data',soil_setting); %显示到表格中
end
总结:
本程序实现的功能:
1)通过公共变量global soil_setting储存土层表格信息
2)变量与表格信息为空时:
点击插入按钮,表格自动生成第一条内容;
点击删除按钮,程序弹出警告选项,提示用户需选择后再删除
3)当变量与表格中存在内容时:
若用户未选择任何一条内容,点击插入按钮,自动在表格最下方插入;
点击删除按钮,程序弹出警告选项,提示用户需选择后再删除;
若用户已选择某条内容,点击插入按钮,在选中的项目下方插入用户输入的内容,点击删除按钮,则删除该内容。文章来源:https://www.toymoban.com/news/detail-848230.html
4)点击清除按钮,程序提示用户,若用户执意清空,则表格清空
本程序存在的bug:
点击插入按钮后,用户单击“取消”或右上角的关闭,程序会报错
因为没有设置接口读取用户的取消操作,后续在此基础上可继续开发文章来源地址https://www.toymoban.com/news/detail-848230.html
到了这里,关于Matlab GUI的uitable控件实现插入、删除、清空的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!