我目前正在编写测试程序来检查Matlab(R2014a)程序的图形前端计算与脚本版本相同的结果(两者都依赖于相同的基础方法)。
到目前为止,我通常使用以下模式来查找窗口和按钮的句柄并执行相应的回调:
handleWindow = findall(0, 'Tag', figureName);
handleButton = findobj(handleWindow, 'Tag', buttonName);
callbackButton = get(handleButton, 'Callback');
callbackButton(handleWindow, []);
这适用于使用GUIDE创建的所有自写图形。但是,在尝试自动搜索问题对话框(questdlg
)时,我遇到了麻烦。
通过使用计时器异步执行命令直到对话框关闭,可以很容易地避免uiwait
阻止进一步执行我的测试脚本的事实。这已经适用于CloseRequestFcn
。
我的问题是,questdlg
中的按钮不存在真正的回调函数,而是调用uiresume(gcbf)
。直接调用uiresume(handleQdlg)
不会关闭对话框。
您是否有任何想法如何模拟点击这些按钮,或者您是否知道有更优雅的方法来模拟点击整体按钮?
答案 0 :(得分:0)
事实证明我已经走上正轨。我的计时器延迟太短了。似乎我试图在尚未等待时恢复窗口。延迟时间更长。
这是我最终使用的功能:
function answerQuestDlg(obj, titleStr, index)
%answerQuestDlg(obj, titleStr, index)
% Find the question dialog with specified title and simulate
% clicking the button with the appropriate index.
% If index is not 1, 2 or 3, simuluate pressing the X.
allRootWindows = allchild(0);
hQuestDlg = findobj(allRootWindows, 'Tag', titleStr);
switch (index)
case 1
hButton = findobj(hQuestDlg, 'Tag', 'Btn1');
case 2
hButton = findobj(hQuestDlg, 'Tag', 'Btn2');
case 3
hButton = findobj(hQuestDlg, 'Tag', 'Btn3');
otherwise
callbackClose = get(hQuestDlg, 'CloseRequestFcn');
callbackClose();
return
end
set(hQuestDlg, 'CurrentObject', hButton);
callbackButton = get(hButton, 'Callback');
if ischar(callbackButton)
callbackStr = strrep(callbackButton, 'gcbf', 'hQuestDlg');
eval(callbackStr);
else
callbackButton();
end
end