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

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

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

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

Аргументы функции обратного вызова

Когда компонент пользовательского интерфейса выполняет функцию обратного вызова, MATLAB автоматически передает два входных параметра функции. Эти входные параметры часто называют src и event. Первый аргумент является компонентом пользовательского интерфейса, который инициировал коллбэк. Второй аргумент предоставляет данные о событиях функции обратного вызова. Данные о событиях, которые это обеспечивает, характерны для свойства коллбэка и типа компонента. Чтобы определить данные о событиях, сопоставленные со свойством коллбэка, смотрите страницу свойств компонента пользовательского интерфейса, который выполняет коллбэк.

Например, updateDropDown функционируйте использует эти входные параметры коллбэка, чтобы добавить элементы в доступное для редактирования выпадающее меню, когда пользователь вводит новое значение. Когда выпадающее выполняет addItems коллбэк, src содержит выпадающий компонент и event содержит информацию о взаимодействии. Функция использует event.Edited свойство проверять, является ли значение новым значением, которое пользователь ввел, или существующий элемент. Затем если значение является новым, функция использует event.Value свойство добавить значение в выпадающие элементы.

Чтобы запустить эту функцию, сохраните его в файл с именем updateDropDown.m на пути MATLAB. Введите новое значение в выпадающем меню, нажмите Enter и просмотрите обновленные выпадающие элементы.

function updateDropDown
  fig = uifigure('Position',[500 500 300 200]);
  dd = uidropdown(fig, ...
    'Editable','on', ...
    'Items',{'Red','Green','Blue'}, ...
    'ValueChangedFcn',@addItems);
end

function addItems(src,event)
  val = event.Value;
  if event.Edited
    src.Items{end+1} = val;
  end
end

A UI figure window with a label and drop-down. The drop-down value is "Purple", and the items contain "Purple" as an option.

Задайте функцию обратного вызова

Присвойте функцию обратного вызова свойству коллбэка одним из следующих способов:

Определение указателя на функцию

Указатели на функцию обеспечивают способ представлять функцию как переменную. Функция может быть или локальной или вложенной функцией в том же файле как код приложения или функция, определяемая в отдельном файле, который находится на пути MATLAB. Чтобы создать указатель на функцию, задайте @ оператор перед именем функции.

Например, чтобы создать кнопку, которая отвечает на нажатие кнопки, сохраните следующую функцию в файл с именем codeButtonResponse.m на пути MATLAB. Этот код создает кнопку с помощью uibutton функция и наборы ButtonPushedFcn свойство быть указателем на функциональный buttonCallback. Это создает этот указатель с помощью обозначения @buttonCallback. Заметьте, что указатель на функцию явным образом не относится ни к каким входным параметрам, но объявление функции включает src и event входные параметры.

function codeButtonResponse
  fig = uifigure('Position',[500 500 300 200]);
  btn = uibutton(fig,'ButtonPushedFcn',@buttonCallback);
    
  function buttonCallback(src,event)
    disp('Button pressed');
  end
end

A UI figure window with a button component.

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

Определение массива ячеек

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

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

Чтобы запустить этот пример, сохраните функцию в файл с именем codeComponentResponse.m на пути MATLAB. Когда вы выбираете или снимаете флажок, MATLAB отображает You clicked the check box. Когда вы нажимаете кнопку, MATLAB отображает You clicked the button.

function codeComponentResponse
  fig = uifigure('Position',[500 500 300 200]);
  cbx = uicheckbox(fig,'Position',[100 125 84 22], ...
    'ValueChangedFcn',{@componentCallback,'check box'});
  btn = uibutton(fig,'Position',[100 75 84 22], ...
    'ButtonPushedFcn',{@componentCallback,'button'});
    
  function componentCallback(src,event,comp)
    disp(['You clicked the ' comp]);
  end
end

A UI figure window with a check box component above a button component.

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

Определение анонимной функции

Анонимная функция является функцией, которая не хранится в программном файле. Задайте анонимную функцию когда:

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

  • Вы хотите, чтобы компонент пользовательского интерфейса выполнил скрипт.

  • Ваш коллбэк состоит из одного исполняемого оператора.

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

Например, changeSlider функция создает ползунок компонент пользовательского интерфейса и кнопка, чтобы постепенно увеличить значение ползунка. incrementSlider функция не имеет источника и аргументов ввода событий, поскольку это спроектировано, чтобы быть вызываемым любая внутренняя или внешняя часть коллбэка. Выполниться incrementSlider когда кнопка нажимается, создайте анонимную функцию, которая принимает src и event входные параметры, игнорирует их и выполняется incrementSlider.

Запускаться changeSlider функция, сохраните код ниже в файл с именем changeSlider.m на пути MATLAB.

function changeSlider
  fig = uifigure('Position',[500 500 300 200]);
  s = uislider(fig,'Position',[75 150 150 3]);
  incrementSlider;
  b = uibutton(fig,'Position',[100 50 100 22], ...
    'Text','Increment', ...
    'ButtonPushedFcn',@(src,event)incrementSlider);
    
  function incrementSlider
    if s.Value < s.Limits(2)
      s.Value = s.Value + 1;
    end
  end
end

A UI figure window with a slider component with a value of 1, and a button below the slider with the text "Increment".

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

fig = uifigure('Position',[500 500 300 200]);
btn = uibutton(fig,'ButtonPushedFcn',@(src,event)disp('Button pressed'));

A UI figure window with a button component.

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

Задайте текст, содержащий Команды MATLAB (не рекомендуемый)

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

Например, код ниже создает UIAxes возразите и кнопка, которая отображает случайные данные на графике по осям, когда по ним кликают. Заметьте, что вектор символов 'plot(ax,rand(20,3))' содержит переменную, ax Переменная ax должен существовать в базовом рабочем пространстве, когда пользователь инициировал коллбэк, или MATLAB возвращает ошибку. Переменная не должна существовать в то время, когда вы присваиваете значение свойства коллбэка, но это должно существовать, когда пользователь инициировал коллбэк.

Запустите код, затем нажмите кнопку. Начиная с ax существует в вашем базовом рабочем пространстве, команда коллбэка допустима, и графики MATLAB данные.

fig = uifigure;
ax = uiaxes(fig,'Position',[125 100 300 300]);
b = uibutton(fig,'Position',[225 50 100 22], ...
  'Text','Plot Data', ...
  'ButtonPushedFcn','plot(ax,rand(20,3))');

A UI figure window with an axes and a button component. The button text says "Plot Data". The axes has three lines of random data displayed on it.

Похожие темы