Matlab 使用uigetdir作为按钮的回调,由于奇怪的无效参数而崩溃

Matlab 使用uigetdir作为按钮的回调,由于奇怪的无效参数而崩溃,matlab,matlab-gui,Matlab,Matlab Gui,我试图在Matlab(R2016a)GUI上创建一个简单的“浏览”按钮。 我的代码类似于: hd = dialog; hb = uicontrol('parent',hd,'style','pushbutton','string','browse',... 'callback',@uigetdir); 回调函数uigetdir有两个可选参数STARTPATH,TITLE。原则上,我可以通过将它们与单元格数组上的函数句柄连接在一起,在回调中传递它们,例如 hd = dialog; hb = ui

我试图在Matlab(R2016a)GUI上创建一个简单的“浏览”按钮。 我的代码类似于:

hd = dialog;
hb = uicontrol('parent',hd,'style','pushbutton','string','browse',...
'callback',@uigetdir);
回调函数
uigetdir
有两个可选参数
STARTPATH,TITLE
。原则上,我可以通过将它们与单元格数组上的函数句柄连接在一起,在回调中传递它们,例如

hd = dialog;
hb = uicontrol('parent',hd,'style','pushbutton','string','browse',...
'callback',{@uigetdir,'myStartPath','myTitle');
无论我的浏览按钮是否使用可选参数调用
uigetdir
,它都会崩溃。不同的错误,相同的原因:
uicontrol
决定将2个未调用的奇怪变量(包含UI属性)作为回调函数的参数,并且
uigetdir
不知道如何处理它们


这是否意味着我不能在GUI中使用
uigetdir
(或几乎任何其他内置函数)作为回调函数?除了编写自定义函数外,还必须有一个解决方案,没有?

默认情况下,所有
uicontrol
对象都传递两个输入参数:

  • uicontrol
    处理自身
  • 包含特定于事件的信息的对象
当您通过简单地将
@
附加到函数名以创建函数句柄来定义回调时,这两个参数将自动传递给函数

相反,您可以创建一个匿名函数来接受两个输入参数,并在没有输入参数的情况下调用
uigetdir
,从而有效地忽略默认的回调输入

set(hb, 'Callback', @(s,e)uigetdir())
如果要传递起始路径和标题,可以从匿名函数中将它们传递到
uigetdir

set(hb, 'Callback', @(s,e)uigetdir('mystartpath', 'mytitle'))

默认情况下,向所有
uicontrol
对象传递两个输入参数:

  • uicontrol
    处理自身
  • 包含特定于事件的信息的对象
当您通过简单地将
@
附加到函数名以创建函数句柄来定义回调时,这两个参数将自动传递给函数

相反,您可以创建一个匿名函数来接受两个输入参数,并在没有输入参数的情况下调用
uigetdir
,从而有效地忽略默认的回调输入

set(hb, 'Callback', @(s,e)uigetdir())
如果要传递起始路径和标题,可以从匿名函数中将它们传递到
uigetdir

set(hb, 'Callback', @(s,e)uigetdir('mystartpath', 'mytitle'))

我建议你读书,真的吗?文档中:“函数定义必须定义两个输入参数,
hObject
callbackdata
。Handle Graphics®在调用函数时自动传递
hObject
callbackdata
。”文档中还包括:注意:如果要使用不支持
hObject
callbackdata
参数的现有函数,则可以将其指定为匿名函数。例如,
uicontrol('Style','slider','Callback',@(hObject,callbackdata)myfunction(x))
“@excaza链接和突出显示的文本确实很有帮助;谢谢。我建议阅读文档中的“真的吗?”“函数定义必须定义两个输入参数,
hObject
callbackdata
。Handle Graphics®在调用函数时会自动传递
hObject
callbackdata
。“注意:如果要使用不支持
hObject
callbackdata
参数的现有函数,则可以将其指定为匿名函数。例如,
uicontrol('Style','slider','Callback',@(hObject,callbackdata)myfunction(x))
“@excaza链接和突出显示的文本确实很有帮助;谢谢。