本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

为以编程方式创建的 App 编写回调

不同用户操作的回调

UI 和图形组件具有特定的属性,可以将这些属性与特定的回调函数相关联。其中每个属性对应于一项特定的用户操作。例如,某个 uicontrol 包含名为 Callback 的属性。可以将此属性的值设为某个回调函数或匿名函数的句柄,或包含 MATLAB® 表达式的字符向量。通过设置此属性,您的 App 可在用户与该 uicontrol 交互时做出响应。如果 Callback 属性没有指定值,则当用户与该 uicontrol 交互时不会发生任何操作。

下表列出了可用的回调属性、触发回调函数的用户操作,以及使用这些属性的常见 UI 和图形组件。

回调属性

用户操作

使用此属性的组件

ButtonDownFcn

最终用户在指针位于组件或图窗上时按下鼠标按键。

axesfigureuibuttongroupuicontroluipaneluitable

Callback

最终用户触发组件。例如:选择菜单项、移动滑块或按下普通按钮。

uicontextmenuuicontroluimenu

CellEditCallback

最终用户在可编辑单元格的表中编辑值。

uitable

CellSelectionCallback

最终用户选中表中的单元格。

uitable

ClickedCallback

最终用户使用鼠标左键点击推送工具或切换工具。

uitoggletooluipushtool

CloseRequestFcn

图窗关闭。

figure

CreateFcn

在 MATLAB 创建对象后且在该对象显示之前,执行回调。

axesfigureuibuttongroupuicontextmenuuicontroluimenuuipushtooluipaneluitableuitoggletooluitoolbar

DeleteFcn

在 MATLAB 即将删除图窗之前执行回调。

axesfigureuibuttongroupuicontextmenuuicontroluimenuuipushtooluipaneluitableuitoggletooluitoolbar

KeyPressFcn

最终用户在指针位于对象上时按下键盘键。

figureuicontroluipaneluipushtooluitableuitoolbar

KeyReleaseFcn

最终用户在指针位于对象上时松开键盘键。

figureuicontroluitable

OffCallback

在切换工具的 State 更改为 'off' 时执行。

uitoggletool

OnCallback

在切换工具的 State 更改为 'on' 时执行。

uitoggletool

SizeChangedFcn

最终用户调整 Resize 属性为 'on' 的按钮组、图窗或面板的大小。

figureuipaneluibuttongroup

SelectionChangedFcn

最终用户选择按钮组内的另一个单选按钮或切换按钮。

uibuttongroup

WindowButtonDownFcn

最终用户在指针位于图窗窗口中时按下鼠标按键。

figure

WindowButtonMotionFcn

最终用户在图窗窗口内移动指针。

figure

WindowButtonUpFcn

最终用户松开鼠标按键。

figure

WindowKeyPressFcn

最终用户在指针位于图窗或其任何子对象上时按下按键。

figure

WindowKeyReleaseFcn

最终用户在指针位于图窗或其任何子对象上时松开按键。

figure

WindowScrollWheelFcn

最终用户在指针位于图窗上时滚动鼠标滚轮。

figure

如何指定回调属性值

要将一个回调函数与一个 UI 组件关联,请将该组件的一个回调属性的值设为对该回调函数的引用。通常在定义组件时执行此操作,但也可以在代码中的任意位置更改回调属性值。

可以采用以下方法之一指定回调属性值:

指定函数句柄

函数句柄提供了一种以变量表示函数的方法。函数必须是与 App 代码处于同一文件内的局部或嵌套函数,也可以将其写入置于 MATLAB 路径上的单独文件。

要创建函数句柄,请在函数名称前面指定 @ 运算符。例如,以下 uicontrol 命令将 Callback 属性指定为函数 pushbutton_callback 的句柄:

b = uicontrol('Style','pushbutton','Callback',@pushbutton_callback);

以下是 pushbutton_callback 的函数定义:

function pushbutton_callback(src,event)
   display('Button pressed');
end
请注意,函数句柄不会显式引用任何输入参数,但函数声明中包含两个输入参数。这两个输入参数对于所有指定为函数句柄的回调都是必需的。MATLAB 会在回调执行时自动传递这些参数。第一个参数是触发回调的 UI 组件。第二个参数为回调函数提供事件数据。如果没有可供回调函数使用的事件数据,则 MATLAB 将以空数组的形式传递第二个输入参数。下表列出了使用事件数据的回调和组件。

回调属性名称组件
WindowKeyPressFcn
WindowKeyReleaseFcn
WindowScrollWheel
figure
KeyPressFcnfigureuicontroluitable
KeyReleaseFcnfigureuicontroluitable
SelectionChangedFcnuibuttongroup
CellEditCallback
CellSelectionCallback
uitable

指定回调为函数句柄的好处在于,MATLAB 会在您将回调指定给组件时检查函数中是否存在语法错误和缺失的依赖项。如果回调函数中存在问题,则 MATLAB 会立即返回错误,而不是等待用户触发回调。此行为可帮助您查找代码中存在的问题,以免遗留到用户手中。

指定元胞数组

使用元胞数组指定回调函数,可以接受您希望在该函数中使用的更多输入参数。元胞数组中的第一个元素是函数句柄。元胞数组中的其他元素是您希望使用的更多输入参数(以逗号分隔)。您指定的函数必须定义与指定函数句柄中所述的完全相同的两个输入参数。不过,您可以在前两个参数之后在函数声明中定义其他输入。

以下 uicontrol 命令将会创建一个普通按钮,并将 Callback 属性指定为元胞数组。在此示例中,函数的名称为 pushbutton_callback,其他输入参数的值为 5

b = uicontrol('Style','pushbutton','Callback',{@pushbutton_callback,5});

以下是 pushbutton_callback 的函数定义:

function pushbutton_callback(src,event,x)
   display(x);
end

与指定为函数句柄的回调一样,MATLAB 会在您将回调指定给组件时,检查指定为元胞数组的回调中是否存在语法错误和缺失的依存项。如果回调函数中存在问题,则 MATLAB 会立即返回错误,而不是等待用户触发回调。此行为可帮助您查找代码中存在的问题,以免遗留到用户手中。

指定匿名函数

在为 UI 组件指定要执行的函数时,如果该函数不支持函数句柄和元胞数组所必需的两个参数,则可以指定匿名函数。例如,以下 uicontrol 命令将会创建一个普通按钮,并将 Callback 属性指定为匿名函数。在此示例中,函数的名称为 myfun,其函数声明仅定义一个输入参数 x

b = uicontrol('Style','pushbutton','Callback',@(src,event)myfun(x));

指定包含 MATLAB 命令的字符向量(不推荐)

如果您需要执行一些简单的命令,但回调包含过多的命令而可能变得难以管理,则可以指定字符向量。您所指定的字符向量必须包含有效的 MATLAB 表达式,其中可能包括函数参数。例如:

hb = uicontrol('Style','pushbutton',...
               'String','Plot line',...
               'Callback','plot(rand(20,3))');
字符向量 'plot(rand(20,3))' 是一条有效命令,并且 MATLAB 会在用户点击按钮时为其求值。如果字符向量包含变量,例如,
'plot(x)'
当用户触发回调时,变量 x 必须在基础工作区内存在,否则将会返回错误。该变量在您指定回调属性值时不需要存在,但在用户触发回调时必须存在。

与指定为函数句柄或元胞数组的回调不同,MATLAB 不会检查字符向量是否存在语法错误或缺少的依赖项。如果 MATLAB 表达式存在问题,在用户触发回调之前,将无法检测到该问题。

相关主题