我正在编写一个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
答案 0 :(得分:-1)
默认情况下,侦听器将根据您的示例传递2个默认参数:
addlistener(hp, 'String', 'PostSet', @mycallback() )
您应该注意到函数中有2个输入:
function mycallback ( src, event )
...
end
您想做的是:
您可以通过控制回调函数来做到这一点:
addlistener(hp, 'String', 'PostSet', @(src,evt)mycallback1(src, evt, hObject, handles))
或
addlistener(hp, 'String', 'PostSet', @(src,evt)mycallback1(hObject, handles))
以上几行捕获的是默认回调src
和evt
,第一个代码是将它们与其他变量一起传递给您的回调,而另一个则没有。
编辑我的回答集中在如何调用侦听器上,我没有图像处理工具箱,因此无法创建使用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))
就像我的原始示例一样。