Как я могу имитировать щелчок пользователя, чтобы вызвать функцию обратного вызова для объекта GUI? - PullRequest
6 голосов
/ 27 апреля 2011

Я пытаюсь программно создать событие щелчка в MATLAB, которое будет имитировать нажатие пользователем объекта GUI.Функция обратного вызова для объекта является подфункцией, поэтому я не могу вызвать ее напрямую.Однако я могу получить свойство обратного вызова от объекта, который в итоге становится массивом ячеек 3 на 1 со следующим содержимым:

@uiBlockFn/callback_til [ 188.0011] [1x1 struct]

Как вызвать эту функцию обратного вызова в коде , который имитирует то, что происходит, когда пользователь щелкает объект GUI?

Ответы [ 2 ]

8 голосов
/ 27 апреля 2011

Допустим, у вас есть графический объект с дескриптором hObject, и вы получили обратный вызов для объекта следующим образом:

callbackCell = get(hObject,'Callback');

Как вы упомянули, массив ячеек callbackCell, который вы получаете, в итоге становится массивом из трех элементов с дескриптором функции в первой ячейке и другими данными в двух других ячейках. Когда обратный вызов для объекта определен как массив ячеек (как в вашем случае), дескриптор функции обратного вызова (или имя строки) сохраняется в первой ячейке и дополнительные входные аргументы, которые вы хотите передать функция обратного вызова находится в остальных ячейках.

Однако, когда этот обратный вызов вызывается, когда объект активирован, фактически в начале списка входных аргументов MATLAB автоматически вставит 2 дополнительных аргумента. Это:

  • hObject: дескриптор объекта, обратный вызов которого теперь вызывается.
  • eventData: структура данных, связанных с активируемым пользователем событием, которая часто представляет собой просто пустую матрицу [] (за исключением в некоторых случаях ).

Итак, если вы хотите имитировать действие объекта, активируемого пользователем, вам нужно вызвать функцию обратного вызова следующим образом (при условии, что данные события не нужны):

callbackCell{1}(hObject,[],callbackCell{2:end});
2 голосов
/ 28 апреля 2011

Для этого предназначена встроенная функция hgfeval : http://undocumentedmatlab.com/blog/hgfeval/

...