1

我可以用菜单或 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 中的所有子 gui?

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

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);

然而,这并没有改变。子对话框图仅在主对话框关闭并且整个代码再次崩溃后才关闭。

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

4

3 回答 3

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

这是官方文档

于 2013-01-22T04:36:29.337 回答
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 或任何需要的地方调用此函数。

于 2014-07-08T14:50:13.280 回答
0

我有一个类似的问题,我的 gui 会产生其他 gui,即选项 gui 和日志 gui。在我的主应用程序中,我有这样的事情。

logFH = CreateLog;
optFH = CreateOptions;

这些函数将创建图形并返回句柄。句柄可以保存在 gui 句柄中或使用setappdataand保存getappdata。稍后我会关闭主要功能。

if (isgraphics(logFH))
    close(logFH);
    delete(logFH);
end
于 2016-06-22T18:10:55.597 回答