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

Using uigetdir as callback for a pushbutton, crashes due to weird, invalid arguments

我正在尝试在 Matlab (R2016a) GUI 上创建一个简单的 "browse" 按钮。 我的代码是这样的:

hd = dialog;
hb = uicontrol('parent',hd,'style','pushbutton','string','browse',...
'callback',@uigetdir);

回调函数 uigetdir 有 2 个可选参数 STARTPATH, TITLE。原则上,我可以通过将它们与元胞数组上的函数句柄连接起来,在我的回调中传递它们,例如

hd = dialog;
hb = uicontrol('parent',hd,'style','pushbutton','string','browse',...
'callback',{@uigetdir,'myStartPath','myTitle');

无论我的浏览按钮使用或不使用可选参数调用 uigetdir,它都会崩溃。不同的错误,相同的原因:uicontrol 决定包含 2 个不需要的、奇怪的变量(包含 UI 属性)作为回调函数的参数,而 uigetdir 不知道该怎么做和他们在一起。

这是否意味着我不能使用 uigetdir(或几乎任何其他内置函数)作为 GUI 中的回调函数?除了写自定义函数,肯定有办法解决吧?

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

  • uicontrol 句柄本身
  • 包含事件特定信息的 object。

当您通过简单地将 @ 附加到函数名称来创建函数句柄来定义回调时,这两个参数会自动传递给函数

您可以设计您的匿名函数以接受两个输入参数并在没有输入参数的情况下调用 uigetdir,从而有效地忽略默认回调输入。

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

如果您想传递起始路径和标题,您可以从匿名函数中将它们传递给 uigetdir

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