Запись коллбэков для приложений, созданных программно

Коллбэки для различных действий пользователя

Пользовательский интерфейс и графические компоненты имеют определенные свойства, которые можно связать с определенными функциями обратного вызова. Каждое из этих свойств соответствует определенному пользовательскому действию. Например, uicontrol имеет свойство, называемое Callback. Можно задать значение этого свойства как handle для функции обратного вызова, анонимной функции или вектора символов, содержащей MATLAB® выражение. Установка этого свойства заставляет ваше приложение реагировать при взаимодействии пользователя с uicontrol. Если на Callback свойство не имеет заданного значения, тогда ничего не происходит при взаимодействии пользователя с uicontrol.

В этой таблице перечислены свойства коллбэка, которые доступны, действия пользователя, которые запускают функцию обратного вызова, и наиболее распространенные UI и графические компоненты, которые их используют.

Свойство коллбэка

Действие пользователя

Компоненты, которые используют это свойство

ButtonDownFcn

Конечный пользователь нажимает кнопку мыши, пока указатель находится на компоненте или рисунке.

axes, figure, uibuttongroup, uicontrol, uipanel, uitable,

Callback

Конечный пользователь инициирует компонент. Например: выбор элемента меню, перемещение ползунка или нажатие кнопки.

uicontextmenu, uicontrol, uimenu

CellEditCallback

Конечный пользователь редактирует значение в таблице, камеры которой можно редактировать.

uitable

CellSelectionCallback

Конечный пользователь выбирает камеры в таблице.

uitable

ClickedCallback

Конечный пользователь нажимает на инструмент нажатия или переключателя левой кнопкой мыши.

uitoggletool, uipushtool

CloseRequestFcn

Рисунок закроется.

figure

CreateFcn

Коллбэк выполняется, когда MATLAB создает объект, но до его отображения.

axes, figure, uibuttongroup, uicontextmenu, uicontrol, uimenu, uipushtool, uipanel, uitable, uitoggletool, uitoolbar

DeleteFcn

Коллбэк выполняется непосредственно перед удалением рисунка MATLAB.

axes, figure, uibuttongroup, uicontextmenu, uicontrol, uimenu, uipushtool, uipanel, uitable, uitoggletool, uitoolbar

KeyPressFcn

Конечный пользователь нажимает клавишу клавиатуры, пока указатель на объект.

figure, uicontrol, uipanel, uipushtool, uitable, uitoolbar

KeyReleaseFcn

Конечный пользователь отпускает клавишу клавиатуры, пока указатель на объект.

figure, uicontrol, uitable

OffCallback

Выполняется, когда State инструмента переключения изменяется на 'off'.

uitoggletool

OnCallback

Выполняется, когда State инструмента переключения изменяется на 'on'.

uitoggletool

SizeChangedFcn

Конечный пользователь изменяет размер группы кнопок, рисунки или панели, Resize которой свойство 'on'.

figure, uipanel, uibuttongroup

SelectionChangedFcn

Конечный пользователь выбирает другой переключатель или кнопку-переключатель в группе кнопок.

uibuttongroup

WindowButtonDownFcn

Конечный пользователь нажимает кнопку мыши, пока указатель находится в окне рисунка.

figure

WindowButtonMotionFcn

Конечный пользователь перемещает указатель мыши в окне рисунка.

figure

WindowButtonUpFcn

Конечный пользователь отпускает кнопку мыши.

figure

WindowKeyPressFcn

Конечный пользователь нажимает клавишу, пока указатель находится на рисунке или на любом из дочерних объектов.

figure

WindowKeyReleaseFcn

Конечный пользователь отпускает клавишу, пока указатель находится на рисунке или любом из дочерних объектов.

figure

WindowScrollWheelFcn

Конечный пользователь поворачивает колесо мыши, пока указатель мыши находится на рисунке.

figure

Как задать значения свойств коллбэка

Чтобы связать функцию обратного вызова с компонентом пользовательского интерфейса, установите значение одного из свойств коллбэка компонента как ссылку на функцию обратного вызова. Как правило, это делается при определении компонента, но можно изменить значения свойств коллбэка в любом месте кода.

Задайте значение свойства коллбэка одним из следующих способов:

Задайте указатель на функцию

Указатели на функцию обеспечивают способ представлять функцию как переменную. Функция должна быть локальной или вложенной функцией в том же файле, что и код приложения, или можно записать ее в отдельный файл, который находится в пути 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
KeyPressFcnfigure, uicontrol, uitable
KeyReleaseFcnfigure, uicontrol, uitable
SelectionChangedFcnuibuttongroup
CellEditCallback
CellSelectionCallback
uitable

Преимущество определения коллбэков в качестве указателей на функцию заключается в том, что MATLAB проверяет функцию на синтаксические ошибки и отсутствующие зависимости при назначении коллбэка компоненту. Если в функции обратного вызова есть проблема, MATLAB возвращает ошибку немедленно, а не ждет, когда пользователь вызовет коллбэк. Это поведение помогает вам найти проблемы в коде, прежде чем пользователь столкнется с ними.

Задайте массив ячеек

Используйте массив ячеек, чтобы задать функцию обратного вызова, которая принимает дополнительные входные параметры, которые вы хотите использовать в функции. Первый элемент массива ячеек является указателем на функцию. Другие элементы массива ячеек являются дополнительными входными параметрами, которые вы хотите использовать, разделенными запятыми. Функция, которую вы задаете, должна задать те же два входных параметров, как описано в Specify a Указатель на Функцию. Однако можно задать дополнительные входы в объявлении функции после первых двух аргументов.

Это 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, он остается незамеченным, пока пользователь не запустит коллбэк.

Похожие темы