Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何模拟从脚本单击questdlg中的按钮_Matlab_User Interface_Dialog_Automation - Fatal编程技术网

Matlab 如何模拟从脚本单击questdlg中的按钮

Matlab 如何模拟从脚本单击questdlg中的按钮,matlab,user-interface,dialog,automation,Matlab,User Interface,Dialog,Automation,我目前正在编写测试例程,以检查Matlab(R2014a)程序的图形前端计算的结果是否与脚本版本相同(两者都依赖于相同的底层方法) 到目前为止,我通常使用以下模式查找窗口和按钮的句柄并执行相应的回调: handleWindow = findall(0, 'Tag', figureName); handleButton = findobj(handleWindow, 'Tag', buttonName); callbackButton = get(handleButton, 'Callback')

我目前正在编写测试例程,以检查Matlab(R2014a)程序的图形前端计算的结果是否与脚本版本相同(两者都依赖于相同的底层方法)

到目前为止,我通常使用以下模式查找窗口和按钮的句柄并执行相应的回调:

handleWindow = findall(0, 'Tag', figureName);
handleButton = findobj(handleWindow, 'Tag', buttonName);
callbackButton = get(handleButton, 'Callback');
callbackButton(handleWindow, []);
这适用于使用GUIDE创建的所有自写图形。但是,我在尝试自动回答问题对话框时遇到了麻烦(
questdlg

uiwait
阻止进一步执行我的testscript,这一事实可以通过使用计时器异步执行命令,直到对话框关闭。这对于
CloseRequestFcn
来说已经很好了

我的问题是,
questdlg
中的按钮没有真正的回调函数,而是调用
uiresume(gcbf)
。直接调用
uiresume(handleQdlg)
不会关闭对话框


你知道如何模拟点击这些按钮吗?或者你知道有什么更优雅的方法来模拟整体点击按钮吗?

因为事实证明我已经走上了正确的道路。我的计时器的延迟时间太短了。好像我在窗口还没等的时候就试着重新打开了。它工作的延迟时间更长

以下是我最终使用的函数:

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

只是一个想法:在代码开头设置一个“脚本标志”会不会太麻烦,如果从脚本运行程序,您会设置为
true
;然后,在这种情况下,您可以使用
swtich/case
语句模拟
quesdlg
的答案,对话框将“关闭”?@Benoit_11如果我尝试不使用全局变量(我真的不想在最终版本中使用这些变量),那么这将非常麻烦。我想最简单的方法是使用另一个函数重载
questdlg
,该函数决定是调用内置的questdlg还是使用易于访问的方法调用伪函数来更改其输出。但在所有情况下,最好只使用自制对话框。我仍然不需要根据测试调整“有效负载”。是的,我同意,我想为问题对话框构建一个简单的GUI将为您节省很多麻烦!我还建议您为此构建自己的小型gui,这就是我在gui工具箱中所做的。您需要小心查找对象的方法,并管理测试是否找到超过1个句柄。例如,@matlabgui我同意,我需要小心处理这些事情。但是,由于我不打算在成品中使用这些窗口(仅在应在干净环境中启动的测试脚本中使用),例如,具有此标题的多个窗口将指示这些脚本中较早出现的问题,无论如何都应予以修复。