如果主GUI正在关闭,则关闭所有GUI:s

时间:2013-01-21 07:43:02

标签: matlab user-interface

我可以用菜单或x按钮关闭我的主gui

function menuProgramQuit_Callback(hObject, eventdata, handles)
close(handles.figure1);

但同时可以打开子gui对话框

function pushbuttonCalibrationConfigure_Callback(hObject, eventdata, handles)
calibrationOutput = uiConfigureCalibration('uiMain', handles.figure1);
waitfor(calibrationOutput);
guidata(handles.output,handles);

如果主要人物关闭,则子gui不会,并且当他subgui(此处)时它会崩溃 uiConfigureCalibration)已关闭,因为主gui的数字句柄无效。

那么在关闭主gui之前,如何在matlab中关闭所有子guis?

编辑: 我更改了代码,以便被调用的对话框将其句柄保存到主对话框的句柄

function uiConfigureCalibration_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for uiConfigureCalibration
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% save handle of calling gui
mainGuiHandleIndex = find(strcmp(varargin, 'uiMain'));
if ~isempty(mainGuiHandleIndex)
    handles.mainHandle = varargin{mainGuiHandleIndex+1};
    handlesMain = guidata(handles.mainHandle);
    handlesMain.('openfigures').('calibration') = handles.figure1;
    guidata(handles.mainHandle, handlesMain);
    guidata(handles.figure1, handles);
end

在主gui的关闭功能中,我无法检查图形是否在主图形关闭之前打开并关闭它

if isfieldRecursive(handles, 'handles.openfigures.calibration') 
    close(handles.openfigures.calibration);
end
close(handles.figure1);
然而,这并没有改变。子对话框图仅在主对话框关闭后关闭,整个代码再次崩溃。

为什么没有用close命令关闭子对话框的图形?

3 个答案:

答案 0 :(得分:1)

您可以使用CloseRequestFcn figure属性执行此操作。

这将允许您拦截删除数字的请求,然后根据需要处理这些请求。

这是一个简单的函数,演示了如何使用CloseRequestFcn来实现上面描述的行为:

function figTest()

f1 = figure('UserData', 1, 'Position', [100 500 50 50]);
f2 = figure('UserData', 2, 'Position', [200 500 50 50]);

set(f1,'CloseRequestFcn', @preCloseMain);

function preCloseMain(src, e)


  % Delete f2, in try-block incase it was already closed
  try 
    fprintf('Closing non-main figures!\n');
    close(f2);
  end 
  fprintf('Closing main figure!\n');     
  delete(src);
end

end

以下是the official docs

答案 1 :(得分:0)

我遇到了同样的问题,我想在打开主窗口时关闭所有现有的GUI窗口。

我写了一个.m函数:

function closeAll()
clear all, close all, fclose('all'), clc, warning('off','MATLAB:xlswrite:AddSheet'); %   close all opened items and clear Matlab workspace
end 

并在GUI OpeningFcn或任何需要的地方调用此函数。

答案 2 :(得分:0)

我有一个类似的问题,我的gui会产生其他guis,即选项gui和log gui。在我的主应用程序中,我有类似的东西。

setappdata

这些函数会创建数字并返回句柄。句柄可以保存在gui句柄中,也可以保存在getappdataif (isgraphics(logFH)) close(logFH); delete(logFH); end 中。后来当我关闭主要功能时。

{{1}}