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, или объектом figure resizefcn или closerequestfcn. Эти обработчики всегда прерывают выполняемый обработчик.
Ссылка на объект, содержащий выполняемый обработчик, может быть получена с помощью функции gcbo. Ссылка на предковый объект figure этого объекта может быть получена с помощью функции gcbf.
- h = gcbo ()
- [h, fig] = gcbo ()
-
Возвращает ссылку на объект, чей обработчик в настоящее время выполняется.
Если обработчик не выполняется, эта функция возвращает пустую матрицу. Эта ссылка получена из свойства корневого объекта
"CallbackObject".При вызове со вторым аргументом возвращает ссылку на figure, содержащую объект, чей обработчик в настоящее время выполняется. Если обработчик не выполняется, второй выходной параметр также устанавливается в пустую матрицу.
- fig = gcbf ()
-
Возвращает ссылку на figure, содержащую объект, чей обработчик в настоящее время выполняется.
Если обработчик не выполняется, эта функция возвращает пустую матрицу. Ссылка, возвращенная этой функцией, совпадает со вторым выходным аргументом функции
gcbo.
Обработчики событий также могут быть добавлены к свойствам с помощью функции addlistener, описанной ниже.
© 1996–2022 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/v5.2.0/Callbacks.html