gpt4 book ai didi

matlab - 以编程方式保存可编辑的 uitable 的更改

转载 作者:太空宇宙 更新时间:2023-11-03 20:02:17 25 4
gpt4 key购买 nike

我在 Matlab 中创建了一个 UItable,其中填充了各种值和选项。看起来像:

enter image description here

对应的代码如下:

selector_1 = { 'A'; 'B' ; 'C' };
selector_2 = { 'A.1'; 'A.2'; 'A.3'; ...
'B.1'; 'B.2'; 'B.3'; ...
'C.1'; 'C.2'; 'C.3' };

rows = 5;

f = figure('name','Configuration of output','Position',[200 200 430 25+rows*20],'numbertitle','off','MenuBar','none');

dat = {'select outputfile...', 'select identifier...', 'Specifier', 'Index'};
dat = repmat(dat,rows,1);
columnname = {'Output file ',...
'Identifier ',...
'Specifier ', 'Index'};
columnformat = { {selector_1{:}}, {selector_2{:}}, 'char', 'numeric' };
columneditable = [true true true true];
t = uitable('Units','normalized','Position',...
[0 0 1 1], 'Data', dat,...
'ColumnName', columnname,...
'ColumnFormat', columnformat,...
'ColumnEditable', columneditable,...
'RowName',[]);
set(t, 'Data', dat,'celleditcallback','get(t,''Data'')');

所以我运行代码,图打开了。因此底层脚本已经完成。当我现在编辑表时,我的 uitable 对象被更改,完成后我可以通过以下方式获得最终配置:

finalconfig =  get(t,'Data');

但问题是我需要手动输入这一行,因为我的脚本已经完成。如果我将此行放在脚本的末尾,则会出现错误。

所以我想到了使用下面的循环,检测何时关闭表并存储最后的配置

while ~isempty(findobj('name','Configuration of output'))
% some action
end
finalconfig = get(t,'Data');

我尝试将所有内容放入循环、整个脚本、仅包括 celleditcallbackset 命令和其他内容,但没有任何效果。当我编辑一个值时,要么我的脚本卡在循环中,要么我的表格显示没有更新。我还在不同的位置尝试了 drawnow。如何处理这种情况?如何自动存储我的最终结果?我认为“关闭窗口”是最好的检测 Action ,因为我认为我无法实现“保存”按钮。我还尝试使用 GUIDE 创建一个 gui,但完全迷路了,我希望不用它就能解决它。


编辑:我现在能够实现“保存”按钮并按如下方式尝试回调:

uimenu('Label','Save configuration','Callback',@saveConfig);
function saveConfig(~,~)
output = get(t,'Data',);
save([pwd 'output.mat'],'output');
end

我还按照 Lucius Domitius Ahenobarbus 的建议实现了自定义 CloseRequestFcn。但后来我遇到以下问题之一:

1)我将所有内容定义为脚本,一切正常,但我需要将 @saveConfig(实际上是我最喜欢的)或 @my_Closefcn 之类的函数定义为我的唯一函数文件工作区,我很难传递正确的参数,因为 dat 始终保持不变,即使它实际上得到了更改。(example from the mathworks site 有效!但它不需要额外的参数。)

2) 当我使用

function configuration
% my script from above
end

我可以直接(嵌套)实现@saveConfig@my_Closefcn,我想参数的传递可以正常工作。但是我的表的编辑不再起作用,抛出以下错误:

Error using handle.handle/get

Invalid or deleted object.

Error while evaluating uitable CellEditCallback

如何解决?既然我知道我什至可以向 uitable 添加按钮,我真的很想避免使用 GUIDE。我上面的代码是可执行的,所以如果你尝试看看我的实际问题是什么,我会很高兴,因为它很难描述。

最佳答案

取决于是否使用 GUIDE:

使用 CloseRequestFcn->

不使用 GUIDE:

%write your own CloseRequestFcn and set the figure CloseRequest-Callback to it:
set(gcf,'CloseRequestFcn',@my_closefcn)
%use gcf or the handle of the figure directly

并定义 my_closefcn,包括图形句柄的删除语句,否则图形不会关闭 :)

有关“重新定义 CloseRequestFcn”的更多信息,请参阅文档。

使用指南:

您可以通过检查图来编辑 CloseRequestFcn。有一个名为 CloseRequestFcn 的字段会自动创建该函数,您无需关心获取句柄。它看起来像这样:

function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Hint: delete(hObject) closes the figure
delete(hObject);

现在在删除图形之前,您应该能够获取 uitable 的数据(如果您有句柄),我建议只将数据分配给基础工作区,例如:

assignin('base', 'finalTableData', get(myTableHandle,'Data'));

编辑

因为我不够清楚,看这个例子:

(在一个脚本中使用)->

function test
h=figure;
x=1:10;
mytable=uitable(h,'Data',x);
set(h,'CloseRequestFcn',@myCloseFcn)
%give a unique Tag:
set(h,'Tag', 'myTag')
set(mytable,'Tag','myTableTag')
end

function myCloseFcn(~,~)
myfigure=findobj('Tag','myTag');
myData=get(findobj(myfigure,'Tag','myTableTag'),'Data')
assignin('base','myTestData',myData)
delete(myfigure)
end

事实上,如果您知道如何找到图形的句柄,则无需关心您的 Closereq-Callback 的参数!只需为您的图形/合适的东西提供一些您以后可以识别的东西。我使用了“Tag”,因为我首先想到的是其他参数。

关于matlab - 以编程方式保存可编辑的 uitable 的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19381405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com