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

uiConfigureCalibrationメイン フィギュアが近くにある場合、サブ gui はそうではなく、メイン gui のフィギュア ハンドルが無効なため、サブ gui (ここでは ) を閉じるとクラッシュし ます。

メイン gui を閉じる前に、どうすれば matlab のすべてのサブ gui を閉じることができますか?

EDIT:呼び出されたダイアログがそのハンドルをメインダイアログのハンドルに保存するようにコードを変更しました

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コマンドで閉じられないのはなぜですか?

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;

これらの関数は Figure を作成し、ハンドルを返します。setappdataハンドルは gui ハンドルまたはとで保存できますgetappdata。後でメイン関数を閉じるとき。

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