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 лишь частично:
- События щелчка мышью:
evt— значение классаdouble: 1 для щелчка левой кнопкой, 2 — средней, 3 — правой. - События нажатия клавиш:
evt— структура с полямиKey(строка),Character(строка) иModifier(массив ячеек со строками). - Другие события:
evt— пустая матрица классаdouble.
Основные функции обратного вызова, доступные для всех графических объектов:
- CreateFcn: вызывается в момент создания объекта. Не вызывается, если объект каким-либо образом изменён, поэтому имеет смысл задавать эту функцию обратного вызова только в вызове функции, создающем объект. Функции обратного вызова, добавленные к
CreateFcnпозднее с помощью функцииset, никогда не будут выполнены. - DeleteFcn: вызывается в момент удаления объекта.
- ButtonDownFcn: вызывается, если при нахождении указателя над объектом нажата кнопка мыши. Обратите внимание, что интерфейс gnuplot не реализует эту функцию обратного вызова.
По умолчанию функции обратного вызова ставятся в очередь (выполняются одна за другой в очереди событий), если только не используются функции 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, описанной ниже.
© 1996–2026 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v9.4.0/Callbacks.html