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

6 次查看(过去 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 中查找有关 MATLAB Support Package for USB Webcams 的更多信息

产品


版本

R2018a

Community Treasure Hunt

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

Start Hunting!