15.4.4 回调

回调函数可以与图形对象关联,并在某些事件发生后触发。所有回调函数的基本结构如下:

function mycallback (hsrc, evt)
  ...
endfunction

其中 hsrc 是回调源的句柄,evt 包含与事件相关的特定数据。

该函数可以作为普通 Octave 函数的函数句柄、匿名函数或表示 Octave 命令的字符串提供。不建议使用后一种语法,因为只有在字符串被求值时才会出现语法错误。 请参阅 函数句柄

然后可以在对象创建时将其与对象关联,也可以稍后使用 set 函数关联。例如:

plot (x, "DeleteFcn", @(h, e) disp ("Window Deleted"))

当绘图被删除时,将显示消息 "Window Deleted"

额外的用户参数可以传递给回调函数,并将在两个默认参数之后传递。例如:

plot (x, "DeleteFcn", {@mycallback, "1"})
...
function mycallback (h, evt, arg1)
  fprintf ("Closing plot %d\n", arg1);
endfunction

注意: 回调函数中的第二个参数 — evt — 仅在 Qt 图形工具包中部分实现:

可用于所有图形对象的基本回调函数有:

默认情况下,回调函数是排队执行的(它们在事件队列中一个接一个地执行),除非使用了 drawnowfigurewaitforgetframepause 函数。如果正在执行的回调调用了这些函数之一,将导致 Octave 刷新事件队列,从而使正在执行的回调被中断。

可以通过将对象的 interruptible 属性设置为 "off" 来指定该对象的回调不应被中断。在这种情况下,Octave 会根据中断回调对象的 busyaction 属性来决定如何处理:

queue(默认值)

中断回调将在当前执行的回调返回后执行。

cancel

中断回调将被丢弃。

interruptible 属性在中断回调为 DeleteFcn、图形的 ResizeFcnCloseRequestFcn 时无效。这些回调总是会中断正在执行的回调。

可以通过 gcbo 函数获取持有正在执行的回调的对象的句柄。该对象的祖先图窗的句柄可以使用 gcbf 函数获取。

 
h = gcbo ()
[h, fig] = gcbo ()

返回当前正在执行回调的对象的句柄。

如果没有回调正在执行,此函数将返回空矩阵。该句柄是从根对象的 "CallbackObject" 属性获取的。

当使用第二个输出参数调用时,返回包含当前正在执行回调的对象的图窗的句柄。如果没有回调正在执行,第二个输出也将被设置为空矩阵。

另请参阅: gcbfgcogcagcfgetset

 
fig = gcbf ()

返回包含当前正在执行回调的对象的图窗的句柄。

如果没有回调正在执行,此函数将返回空矩阵。此函数返回的句柄与 gcbo 的第二个输出参数相同。

另请参阅: gcbogcfgcogcagetset

回调同样可以通过下面描述的 addlistener 函数添加到属性中。


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4