CloseReque​stFcnコールバッ​クが実行されない

조회 수: 9 (최근 30일)
koji fukumoto
koji fukumoto 2018년 12월 3일
편집: Kazuya 2018년 12월 3일
・Figure上にWEBカメラ映像を表示
・終了ボタン、またはクローズボタン(ウインドウ右上の×ボタン)押下でアプリ終了
というアプリを作成したのですが、クローズボタン押下(CloseRequestFcn)が反応しません。
(my_closereq関数に処理が飛んできません)
「カメラ映像を表示するコード」をコメントアウトするとクローズボタン押下が反応してアプリが終了します。
実装方法で不適切な点などございますでしょうか?
※カメラ映像を表示する処理は
で頂いた回答を参考にしております。
% カメラハンドル取得
hCam = webcam(1);
% 実行画面GUIの作成と、不要なfigureデータの解放
figHandle = createWindow(hCam);
while true
pause(0.001);
% [終了]ボタン押下、またはクローズボタン押下時は即終了
if(isvalid(hPbExit) == 1 && getappdata(hPbExit, 'exitKeyPressed') == 1)
if(isvalid(hCam) == 1)
hCam.closePreview;
delete(hCam);
end
delete(figHandle);
return;
end
end
% [終了]ボタン押下時コールバック関数
function exitPressFcn(hObject, ~)
setappdata(hObject, 'exitKeyPressed', 1);
end
% Closeイベントハンドラ
function my_closereq(src,callbackdata)
global hPbExit;
setappdata(hPbExit, 'exitKeyPressed', 1);
end
% 実行画面作成関数
function figHandle = createWindow(hCam)
global hPbExit;
% ウインドウの生成
figHandle = figure('CloseRequestFcn', @my_closereq, 'Name', 'Tracker', 'tag', 'mainFigure', 'OuterPosition', [100, 100, 800, 800]);
clf(figHandle);
set(figHandle, 'Name', 'カメラ映像', 'NumberTitle', 'off')
set(figHandle, 'MenuBar', 'none');
% 以下の処理をコメントアウトすると、クローズボタンが効くようになる
%-----------------------------------------------
% カメラ映像を表示
if(isempty(hCam) == 0 && isvalid(hCam) == 1)
ax = axes('parent', figHandle);
yticks(ax, []);
xticks(ax, []);
frame = snapshot(hCam);
im = image(ax, zeros(size(frame), 'uint8'));
axis(ax, 'image');
preview(hCam, im);
end
%-----------------------------------------------
% 終了ボタンを配置
hPbExit = uicontrol(figHandle, 'Style', 'pushbutton', 'String', '終了', 'FontSize', 12,...
'Units', 'normalized', 'Position', [0.6 0.1 0.3 0.05], 'Callback', @exitPressFcn);
setappdata(hPbExit, 'exitKeyPressed', 0);
drawnow;
end
よろしくお願い致します。

채택된 답변

Kazuya
Kazuya 2018년 12월 3일
편집: Kazuya 2018년 12월 3일
解決策まで行きついていませんが、my_closereq関数に処理が飛ばない原因だけはわかったので共有しますね。。
preview(hCam, im);
を呼ぶ前後でブレークポイントを設定して見てもらえれば分かりますが、preview の実行によって figHandle の CloseRequestFcn が書き換えられています。
preview 前
K>> figHandle.CloseRequestFcn
ans =
値をもつ function_handle:
@my_closereq
preview 後
K>> figHandle.CloseRequestFcn
ans =
値をもつ function_handle:
@(src,event)obj.closePreviewWindowCallback
もちろん、preview を実行後に改めて
figHandle.CloseRequestFcn = @my_closereq;
とコールバック関数を再設定すればうまくいっているようには見えますが、本来実行されるべき(?)closePreviewWindowCallback 内の処理が確認できないので少し不安が残ります。

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 対話型コントロールとコールバック에 대해 자세히 알아보기

제품


릴리스

R2018a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!