(App Designer) Callback for an ROI event does not work

9 views (last 30 days)
I have spent a lot of time trying to figure this out, so now is time to ask for help -
In App Designer, I have been trying to set up a callback triggered by changing a position of an ROI line in a (standard, not UI) axes object
function startupFcn(app)
app.ax = axes(app.Panel, 'Title', [], 'XLabel', [], 'YLabel', [], 'Color', 'none','YColor', 'none', 'Xlim', [0 1.5], 'YTick', [], 'XTick', [0 0.5 1 1.5], 'TickDir', 'both', 'TickLength', [0.03 0.035], 'XMinorTick', 'on', 'Units', 'pixels','Position', [8 30 284 0]);
disableDefaultInteractivity(app.ax);
app.ax.Toolbar.Visible = 'off';
app.line1 = drawline(app.ax,'Position',[app.RMP_t1 0; app.RMP_t2 0]);
addlistener(app.line1, 'Position', 'ROIMoved', @line1Moved);
drawnow;
app.UIFigure.WindowState = 'maximized';
end
However, I get the following error:
Error using images.roi.Line/addlistener
Event 'ROIMoved' is not defined for class 'images.roi.Line'.
According to the documentation on images.roi.Line class, this should be a valid event name. By the way, when I remove the 'Position' argument, the app runs without errors but the callback (@line1Moved) doesn't do anything.
  1 Comment
Jyotsna Talluri
Jyotsna Talluri on 22 Aug 2019
The error is due to 'Position' argument and its not due to 'ROIMoved' as addlistener creates listener for given event triggered by callback function on the object.It cannot take 'Position' as argument.
If your function 'line1Moved' is correct then that should work fine.Can your provide your 'line1Moved' function so that I can check

Sign in to comment.

Accepted Answer

Marek Svoboda
Marek Svoboda on 22 Aug 2019
Thank you @Joytsna for your answer!
I actually figured it out last night - and you are correct, the 'Position' shouldn't be there. Here is the correct code for the addistener() that now works in my app (adapted from Marc McLean's answer):
addlistener(app.l1, 'MovingROI', @(varargin)l1Moving(app, app.l1));
It does not work without the "(varargin)" and "(app, app.l1)" pieces, which I still quite don't understand. I know that "varargin" allows a function to take in a variable number of inputs, but I'm not sure what exactly it does here, when placed before the function handle.
  2 Comments
Jyotsna Talluri
Jyotsna Talluri on 25 Aug 2019
That implies 'varargin' is argument to the function handle,which means it takes any number of inputs.The function 'l1Moving' can be called with any numer of input arguments
Marek Svoboda
Marek Svoboda on 25 Aug 2019
Thank you for the explanation!
I still don't understand, however, why the function doesn't work without the "(varargin)" part even when the input arguments correspond to the definition of the function called.

Sign in to comment.

More Answers (0)

Categories

Find more on Migrate GUIDE Apps in Help Center and File Exchange

Products


Release

R2019a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!