Запись коллбэков в GUIDE

Примечание

Окружение GUIDE будет удаляемо в следующем релизе. После удаления GUIDE существующие приложения GUIDE будут продолжать запускаться в MATLAB® но они не будут редактироваться в GUIDE.

Чтобы продолжить редактирование существующего приложения GUIDE, смотрите GUIDE Migration Strategies для получения информации о том, как помочь поддерживать совместимость приложения с будущими релизами MATLAB. Чтобы создать новые приложения в интерактивном режиме, вместо этого Разрабатывайте приложения с использованием App Designer.

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

Пользовательский интерфейс и графические компоненты имеют определенные свойства, которые можно связать с определенными функциями обратного вызова. Каждое из этих свойств соответствует определенному пользовательскому действию. Например, uicontrol имеет свойство, называемое Callback. Можно задать значение этого свойства как указатель для функции обратного вызова, анонимной функции или вектора символов, содержащего выражение 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

Функции обратного вызова, сгенерированные GUIDE, и значения свойств

Как GUIDE управляет функциями и свойствами обратного вызова

После того, как вы добавите a uicontrol, uimenu, или uicontextmenu компонент к вашему пользовательскому интерфейсу, но прежде чем вы сохраняете его, GUIDE заполняет Callback свойство со значением, %automatic. Это значение указывает, что GUIDE сгенерирует имя для функции обратного вызова.

Когда вы сохраняете свой пользовательский интерфейс, GUIDE добавляет пустое определение функции обратного вызова в файл кода, и это устанавливает Callback элемента управления свойство, которое должно быть анонимной функцией. Это определение функции является примером сгенерированной GUIDE функции обратного вызова для кнопки-кнопки.

function pushbutton1_Callback(hObject,eventdata,handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

end
Если вы сохраняете этот пользовательский интерфейс с именем, myui, затем GUIDE устанавливает Callback кнопки свойство к следующему значению:
@(hObject,eventdata)myui('pushbutton1_Callback',hObject,eventdata,guidata(hObject))
Это анонимная функция, которая служит ссылкой на функцию, pushbutton1_Callback. Эта анонимная функция имеет четыре входных параметров. Первый аргумент является именем функции обратного вызова. Последние три аргумента предоставлены MATLAB и обсуждаются в разделе «Синтаксис коллбэка GUIDE».

Примечание

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

Синтаксис коллбэка GUIDE

Все коллбэки должны принимать по крайней мере три входных параметров:

  • hObject - компонент UI, который инициировал коллбэк.

  • eventdata - Переменная, содержащая подробную информацию о конкретных действиях мыши или клавиатуры.

  • handles - A struct который содержит все объекты в пользовательском интерфейсе. GUIDE использует guidata функция для хранения и обслуживания этой структуры.

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

Аргумент eventdata

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

Имя свойства коллбэкаКомпонент
WindowKeyPressFcn
WindowKeyReleaseFcn
WindowScrollWheel
figure
KeyPressFcnfigure, uicontrol, uitable
KeyReleaseFcnfigure, uicontrol, uitable
SelectionChangedFcnuibuttongroup
CellEditCallback
CellSelectionCallback
uitable

Совместное использование данных между коллбэками GUIDE

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

МетодОписаниеТребования и компромиссы
Совместное использование UserData

Получите или установите значения свойств непосредственно через объект компонента.

Все компоненты пользовательского интерфейса имеют UserData свойство, которое может хранить любые данные MATLAB.

  • Требуется доступ к компоненту, чтобы задать или получить свойства.

  • UserData содержит только одну переменную за раз, но можно хранить несколько значений как struct массив или массив ячеек.

Совместное использование данных приложений

Связать данные с определенным компонентом можно используя функцию setappdata функция. Вы можете получить к нему доступ позже, используя getappdata функция.

  • Требуется доступ к компоненту для установки или извлечения данных приложения.

  • Можно совместно использовать несколько переменных.

Использование guidata

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

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

  • Сохраняет только одну переменную за раз, но можно хранить несколько значений как struct массив или массив ячеек.

Совместное использование UserData в приложениях GUIDE

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

Чтобы настроить приложение GUIDE для совместного использования данными ползунка с UserData свойство, выполните следующие шаги:

  1. В Командном окне введите guide чтобы открыть новый пустой графический интерфейс пользователя.

  2. Отображение имен компонентов пользовательского интерфейса в палитре компонентов:

    1. Выберите File > Preferences > GUIDE.

    2. Выберите Show names in component palette.

    3. Нажмите OK.

  3. Выберите инструмент кнопки из палитры компонентов в левой части редактора размещений и перетащите его в область размещения.

  4. Выберите инструмент ползунка из палитры компонентов в левой части редактора размещений и перетащите его в область размещения.

  5. Выберите File > Save. Сохраните пользовательский интерфейс как myslider.fig. MATLAB открывает файл кода в редакторе.

  6. Установите начальное значение UserData свойство в функции открытия, myslider_OpeningFcn. Эта функция выполняется непосредственно перед тем, как пользовательский интерфейс будет виден пользователям.

    В myslider_OpeningFcn, вставьте эти команды сразу после команды, handles.output = hObject.

    data = struct('val',0,'diffMax',1);
    set(handles.slider1,'UserData',data);
    
    После добавления команд myslider_OpeningFcn выглядит вот так.
    function myslider_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to junk (see VARARGIN)
    
    % Choose default command line output for myslider
    handles.output = hObject;
    data = struct('val',0,'diffMax',1);
    set(handles.slider1,'UserData',data);
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes myslider wait for user response
    % uiwait(handles.figure1);
    
    Заметьте, что handles является входной параметр к myslider_OpeningFcn. The handles переменная является структурой, которая содержит все компоненты в пользовательском интерфейсе. Каждое поле в этой структуре соответствует отдельному компоненту. Каждое имя поля соответствует Tag свойство соответствующего компонента. Таким образом, handles.slider1 является компонентом ползунка в этом пользовательском интерфейсе. Команда, set(handles.slider1,'UserData',data) сохраняет переменную, data, в UserData свойство ползунка.

  7. Добавьте код к коллбэку ползунка для изменения данных. Добавьте эти команды в конец функции, slider1_Callback.

    maxval = get(hObject,'Max');  
    sval = get(hObject,'Value');  
    diffMax = maxval - sval;   
    data = get(hObject,'UserData');
    data.val = sval;
    data.diffMax = diffMax;
    % Store data in UserData of slider
    set(hObject,'UserData',data);
    После добавления команд slider1_Callback выглядит вот так.
    % --- Executes on slider movement.
    function slider1_Callback(hObject, eventdata, handles)
    % hObject    handle to slider1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hints: get(hObject,'Value') returns position of slider
    %        get(hObject,'Min') and get(hObject,'Max') to determine range of slider
    maxval = get(hObject,'Max');  
    sval = get(hObject,'Value');  
    diffMax = maxval - sval;   
    data = get(hObject,'UserData');
    data.val = sval;
    data.diffMax = diffMax;
    % Store data in UserData of slider
    set(hObject,'UserData',data);
    
    Заметьте, что hObject является входной параметр к slider1_Callback функция. hObject всегда является компонентом, который запускает коллбэк (ползунок, в данном случае). Таким образом, set(hObject,'UserData',data), сохраняет data переменная в UserData свойство ползунка.

  8. Добавьте код к коллбэку для извлечения данных. Добавьте эти команды в конец функции, pushbutton1_Callback.

    % Get UserData from the slider
    data = get(handles.slider1,'UserData');
    currentval = data.val;
    diffval = data.diffMax;
    display([currentval diffval]);
    После добавления команд pushbutton1_Callback выглядит вот так.

    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get UserData from the slider
    data = get(handles.slider1,'UserData');
    currentval = data.val;
    diffval = data.diffMax;
    display([currentval diffval]);

    Этот код использует структуру handles для доступа к ползунку. Команда, data = get(handles.slider1,'UserData'), получает ползунок UserData свойство. Затем, display функция отображает сохраненные значения.

  9. Сохраните код, нажав Save в редакторе.

Совместное использование данных приложений в приложениях GUIDE

Чтобы сохранить данные приложения, вызовите setappdata функция:

setappdata(obj,name,value);
Первый вход, obj, - объект компонента, в котором можно хранить данные. Второй вход, name, - понятное имя, описывающее значение. Третий вход, value, - значение, которое вы хотите хранить.

Чтобы извлечь данные приложения, используйте getappdata функция:

data = getappdata(obj,name);
Компонент, obj, должен быть объектом компонента, содержащим данные. Второй вход, name, должно совпадать с именем, используемым для хранения данных. В отличие от UserData свойство, которое содержит только одну переменную, вы можете использовать setappdata для хранения нескольких переменных.

Чтобы настроить приложение GUIDE для совместного использования данными о приложениях, выполните следующие шаги:

  1. В Командном окне введите guide чтобы открыть новый пустой графический интерфейс пользователя.

  2. Отображение имен компонентов пользовательского интерфейса в палитре компонентов:

    1. Выберите File > Preferences > GUIDE.

    2. Выберите Show names in component palette.

    3. Нажмите OK.

  3. Выберите инструмент кнопки из палитры компонентов в левой части редактора размещений и перетащите его в область размещения.

  4. Выберите инструмент ползунка из палитры компонентов в левой части редактора размещений и перетащите его в область размещения.

  5. Выберите File > Save. Сохраните пользовательский интерфейс как myslider.fig. MATLAB открывает файл кода в редакторе.

  6. Установите начальное значение данных приложения в функции открытия, myslider_OpeningFcn. Эта функция выполняется непосредственно перед тем, как пользовательский интерфейс будет виден пользователям. В myslider_OpeningFcn, вставьте эти команды сразу после команды, handles.output = hObject.

    setappdata(handles.figure1,'slidervalue',0); 
    setappdata(handles.figure1,'difference',1);
    После добавления команд myslider_OpeningFcn выглядит вот так.
    function myslider_OpeningFcn(hObject,eventdata,handles,varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to junk (see VARARGIN)
    
    % Choose default command line output for junk
    handles.output = hObject;
    setappdata(handles.figure1,'slidervalue',0); 
    setappdata(handles.figure1,'difference',1);
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes junk wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    Заметьте, что handles является входной параметр к myslider_OpeningFcn. The handles переменная является структурой, которая содержит все компоненты в пользовательском интерфейсе. Каждое поле в этой структуре соответствует отдельному компоненту. Каждое имя поля соответствует Tag свойство соответствующего компонента. В этом случае handles.figure1 - объект рисунка. Таким образом, setappdata может использовать этот рисунок объект для хранения данных.

  7. Добавьте код к коллбэку ползунка для изменения данных. Добавьте эти команды в конец функции, slider1_Callback.

    maxval = get(hObject,'Max');  
    currval = get(hObject,'Value');  
    diffMax = maxval - currval;   
    % Store application data
    setappdata(handles.figure1,'slidervalue',currval); 
    setappdata(handles.figure1,'difference',diffMax);
    После добавления команд slider1_Callback выглядит вот так.
    function slider1_Callback(hObject, eventdata, handles)
    % hObject    handle to slider1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hints: get(hObject,'Value') returns position of slider
    %        get(hObject,'Min') and get(hObject,'Max') to determine range of slider
    maxval = get(hObject,'Max');  
    currval = get(hObject,'Value');  
    diffMax = maxval - currval;   
    % Store application data
    setappdata(handles.figure1,'slidervalue',currval); 
    setappdata(handles.figure1,'difference',diffMax);
    Эта функция обратного вызова имеет доступ к handles структуру, так что setappdata команды хранят данные в handles.figure1.

  8. Добавьте код к коллбэку для извлечения данных. Добавьте эти команды в конец функции, pushbutton1_Callback.

    % Retrieve application data
    currentval = getappdata(handles.figure1,'slidervalue');
    diffval = getappdata(handles.figure1,'difference');
    display([currentval diffval]);
    После добавления команд pushbutton1_Callback выглядит вот так.
    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Retrieve application data
    currentval = getappdata(handles.figure1,'slidervalue');
    diffval = getappdata(handles.figure1,'difference');
    display([currentval diffval]);
    Эта функция обратного вызова имеет доступ к handles структуру, так что getappdata команды получают данные из handles.figure1.

  9. Сохраните код, нажав Save в редакторе.

Использование guidata Хранение и совместное использование данных в приложениях GUIDE

GUIDE использует guidata функция для хранения структуры с именем handles, который содержит все компоненты пользовательского интерфейса. MATLAB передает handles массив для каждой функции обратного вызова. Если вы хотите использовать guidata для совместного использования дополнительных данных добавьте поля в handles структура в функции открытия. Функция открытия является функцией, заданной в верхней части вашего файла кода, который имеет _OpeningFcn в имени.

Чтобы изменить данные в функции обратного вызова, измените handles структуру, а затем хранить ее, используя guidata функция. Эта функция обратного вызова ползунка показывает, как изменить и сохранить handles структура в функции обратного вызова GUIDE.

function slider1_Callback(hObject, eventdata,handles)
% hObject   handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles   structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range
	handles.myvalue = 2;
	guidata(hObject,handles);
end 

ПРИМЕР GUIDE: Делитесь данными ползунка Используя guidata

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

Пример GUIDE: совместное использование данных между двумя приложениями

Вот предварительно построенное приложение GUIDE, которое использует данные приложений и guidata функция для совместного использования данных между двумя диалоговыми окнами. Когда вы вводите текст во втором диалоговом окне и нажимаете кнопку OK, метка кнопки изменяется в первом диалоговом окне.

В changeme_main.m, а buttonChangeMe_Callback функция выполняет эту команду для отображения второго диалогового окна:

changeme_dialog('changeme_main', handles.figure)

The handles.figure входной параметр является Figure объект для диалогового окна changeme_main.

The changeme_dialog функция извлекает handles структура из Figure объект. Таким образом, весь набор компонентов в диалоговом окне changeme_main доступен для второго диалогового окна.

Пример GUIDE: Поделитесь данными между тремя приложениями

Вот предварительно построенное приложение GUIDE, которое использует guidata и UserData для обмена данными между тремя окнами приложений. Большое окно является редактором значков, который принимает информацию из окон инструментальной палитры и цветовой палитры.

В guide_inconeditor.m, функция guide_iconeditor_OpeningFcn содержит следующую команду:

colorPalette = guide_colorpalette('iconEditor', hObject)

Аргументы следующие:

  • 'iconEditor' указывает, что коллбэк в guide_iconEditor окне инициировал выполнение функции.

  • hObject является Figure объект для guide_iconEditor окна.

  • colorPalette является Figure объект для guide_colorPalette окна.

Точно так же guide_iconeditor_OpeningFcn вызывает guide_toolpalette функция с аналогичными входными и выходными аргументами.

Передача Figure объект между этими функциями позволяет guide_iconEditor окну получить доступ к handles структура двух других окон. Точно так же два других окна могут получить доступ к handles структура для окна guide_iconEditor.

Переименование и удаление сгенерированных GUIDE коллбэков

Переименование коллбэков

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

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

  • Определение функции обратного вызова компонента

  • Значение свойства коллбэка компонента

  • Ссылки в файле кода на соответствующее поле в handles структура

Переименование функции обратного вызова без изменения Tag компонента свойство:

  1. Измените имя в определении функции обратного вызова.

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

    @(hObject,eventdata)myui('pushbutton1_Callback',...
                               hObject,eventdata,guidata(hObject))

    В этом примере вы должны изменить, 'pushbutton1_Callback' к новому имени функции.

  3. Измените все другие ссылки на старое имя функции на новое имя функции в файле кода.

Удаление коллбэков

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

  1. Поиск и замена всех образцов, которые ссылаются на функцию обратного вызова в вашем коде.

  2. Откройте пользовательский интерфейс в GUIDE и замените все образцы, которые ссылаются на функцию обратного вызова в Property Inspector.

  3. Удалите функцию обратного вызова.

Похожие темы