回调函数可以与图形对象关联,并在某些事件发生后触发。所有回调函数的基本结构如下:
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 图形工具包中部分实现:
evt 是一个 double 类型的值:1 表示左键,2 表示中键,3 表示右键。
evt 是一个结构体,包含字段 Key(字符串)、Character(字符串)和 Modifier(字符串元胞数组)。
evt 是一个 double 类型的空矩阵。
可用于所有图形对象的基本回调函数有:
set 函数添加到 CreateFcn 的回调将永远不会被执行。
默认情况下,回调函数是排队执行的(它们在事件队列中一个接一个地执行),除非使用了 drawnow、figure、waitfor、getframe 或 pause 函数。如果正在执行的回调调用了这些函数之一,将导致 Octave 刷新事件队列,从而使正在执行的回调被中断。
可以通过将对象的 interruptible 属性设置为 "off" 来指定该对象的回调不应被中断。在这种情况下,Octave 会根据中断回调对象的 busyaction 属性来决定如何处理:
queue(默认值)中断回调将在当前执行的回调返回后执行。
cancel中断回调将被丢弃。
interruptible 属性在中断回调为 DeleteFcn、图形的 ResizeFcn 或 CloseRequestFcn 时无效。这些回调总是会中断正在执行的回调。
可以通过 gcbo 函数获取持有正在执行的回调的对象的句柄。该对象的祖先图窗的句柄可以使用 gcbf 函数获取。
h = gcbo () ¶[h, fig] = gcbo () ¶返回当前正在执行回调的对象的句柄。
如果没有回调正在执行,此函数将返回空矩阵。该句柄是从根对象的 "CallbackObject" 属性获取的。
当使用第二个输出参数调用时,返回包含当前正在执行回调的对象的图窗的句柄。如果没有回调正在执行,第二个输出也将被设置为空矩阵。
fig = gcbf () ¶返回包含当前正在执行回调的对象的图窗的句柄。
如果没有回调正在执行,此函数将返回空矩阵。此函数返回的句柄与 gcbo 的第二个输出参数相同。
回调同样可以通过下面描述的 addlistener 函数添加到属性中。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-4