在GUI中带有附加参数的MATLAB addlistener

时间:2018-09-04 05:23:11

标签: matlab matlab-guide

我正在编写一个MATLAB - Removing symfony/event-dispatcher (v3.4.14) [RuntimeException] Could not delete /path-to-site/vendor/symfony/event-dispatcher/GenericEvent.php: update [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--lock] [--no-custom-installers] [--no-autoloader] [--no-scripts] [--no- progress] [--no-suggest] [--with-dependencies] [--with-all-dependencies] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap- authoritative] [--apcu-autoloader] [--ignore-platform-reqs] [--prefer- stable] [--prefer-lowest] [-i|--interactive] [--root-reqs] [--] [<packages>]... ,它的轴可以使用按钮显示图像。我还使用GUI来显示鼠标位置的像素坐标,如下所示:

impixelinfoval

我可以成功地将侦听器添加到h = imshow('hestain.png', 'Parent', handles.axes1); hp = impixelinfoval(gcf, h); 的句柄中,而无需通过以下方式将参数传递给回调函数:

impixelinfoval

但是,我试图按如下方式将两个参数传递给回调函数,但是我没有成功将它们传递给函数。我需要addlistener(hp, 'String', 'PostSet', @mycallback) % Works 来存储在回调函数中计算出的变量,以及handles才能执行hObject,以便可以在整个GUI中访问新变量。

guidata(hObject, handles)

有人可以帮助我解决这个问题吗?

以下是测试此问题的整个MWE:

addlistener(hp, 'String', 'PostSet', @mycallback1(hObject, handles))  % Does not work

1 个答案:

答案 0 :(得分:-1)

默认情况下,侦听器将根据您的示例传递2个默认参数:

addlistener(hp, 'String', 'PostSet', @mycallback() )

您应该注意到函数中有2个输入:

function mycallback ( src, event )
   ...
end

您想做的是:

  1. 添加2个额外的参数
  2. 将2个默认参数替换为其他2。

您可以通过控制回调函数来做到这一点:

addlistener(hp, 'String', 'PostSet', @(src,evt)mycallback1(src, evt, hObject, handles))

addlistener(hp, 'String', 'PostSet', @(src,evt)mycallback1(hObject, handles))

以上几行捕获的是默认回调srcevt,第一个代码是将它们与其他变量一起传递给您的回调,而另一个则没有。

编辑我的回答集中在如何调用侦听器上,我没有图像处理工具箱,因此无法创建使用impixelinfoval函数的代码。

由于您的代码本身无法运行,因此我在下面创建了一个小示例,该示例向您展示如何添加侦听器,该侦听器在设置了字符串属性(在这种情况下为轴标题)时会做出反应,因此它可以自行运行您应该能够运行它并查看其工作原理。

function untitled
 %%
 % create a figure
  h = figure;
  % create an axes
  ax = axes ( 'parent', h );
  % create a variable which we will plot
  p = peaks(50);
  % plot the variable
  imagesc ( p, 'parent', ax );
  % createa some initial title, x and y lables
  t = title ( ax, 'Title' );
  x = xlabel ( ax, 'X Label' );
  y = ylabel ( ax, 'Y Label' );
  %  add a callback to run when the mouse moves.
  h.WindowButtonMotionFcn = @(a,b)moveMouse (ax, t);
  % add listeners which are triggered after the title has been set
  %  this listener passes the standard callbacks and some extras, namely
  %    the handles of the title and the y label
  addlistener ( t, 'String', 'PostSet', @(h,evt)mycallback1(h,evt,t,y) )
  % this listener only passes the handle to the title and the x label
  addlistener ( t, 'String', 'PostSet', @(h,evt)mycallback(t,x) )
end
function moveMouse ( ax, t )
  % update the title of the axes for
  t.String = sprintf ( 'current point %.1f,%.1f', ax.CurrentPoint(1,1:2) );
end
function mycallback ( t, x )
  % udpate the x label string
  x.String = sprintf ( 'X Label -> title value: %s', t.String );
end
function mycallback1 ( h, event, t, y )
  % update the y label string
  y.String = sprintf ( 'Y Label -> title value: %s', t.String );
end

此GUI是通过代码创建的(不是指南)。

这通过在鼠标移动以提供当前点时更新轴标题来进行。我添加了2个侦听器,以在设置标题后更新X和Y标签字符串。

了解了如何添加侦听器后,您应该能够在自己的代码中使用此理论,并且这可能会突出显示您还剩下什么错误。

您在下面的评论中显示的错误消息

addlistener(hp, 'String', 'PostSet', @(source, event, hObject, handles)myImageMagnifier3(source, event, hObject, handles))

我怀疑这应该是

addlistener(hp, 'String', 'PostSet', @(source, event)myImageMagnifier3(source, event, hObject, handles))

就像我的原始示例一样。