从侦听器

时间:2017-01-16 18:13:09

标签: matlab matlab-figure matlab-guide

这是guidata(hOjbect, handles)似乎没有更新值的许多其他人遇到的类似问题。我和听众一起使用它,我不知道该如何继续。

在我的gui_OpeningFcn我有以下一行:

addlistener(handles.s, 'name', 'PostSet', @(s,e)updatefilesave(hObject, [], handles));

这会适当地设置侦听器,并在修改名称时调用updatefilesave。但是,updatefilesave内部是以下代码:

handles.fileUnsaved = true;
guidata(hObject, handles);

在函数内部,两条线都有效。当我在第一行和步骤上断点时,fileUnsaved被设置为true。在我执行第二行(仍然在updatefilesave函数内)后,handles.fileUnsaved仍然设置为true。

然而,当我退出该功能时,绿色箭头会被放到addlistener功能的gui_OpeningFcn行。在此级别,handles.fileUnsaved现在设置为false。

如何在使用侦听器时获取更新句柄?

修改

我尝试做的是知道输入字段何时发生变化,以便在关闭程序之前提示用户保存他们的工作。我检查了CloseRequestFcn中的fileUnsaved标志,如果是真的,我会询问用户是否要在退出前保存。

function namebox_Callback(hObject, eventdata, handles)

newName = handles.namebox.String;
if ~isempty(newName)
    handles.s.name = newName; % (listener gets triggered here post set)
end

handles.namebox.String = handles.s.name;

guidata(hObject, handles); % (namebox's local handles with fileUnsaved set to false gets put into hObject)

这就是我无法在handles = guidata(hObject)中致电CloseRequestFcn的原因。阻止此操作的唯一方法是在调用handles = guidata(hObject)之前在名称框回调中调用guidata(hObject, handles)。但到处都这样做会破坏使用听众的意义。我会在每个回调函数(大约50个)中将fileUnsaved设置为true。

2 个答案:

答案 0 :(得分:1)

我偶然发现这个线程有一个类似的问题,但是对我来说,修改监听器中的句柄似乎是可行的。

在外部函数中,我有这样的东西:

handles.myListener = addlistener(ObjectThrowingEvent,'EventName', @(src,evt)ListenerFunction(src, evnt, hObject));
guidata(hObject,handles);

然后在内部函数中

function ListenerFunction(ObjectThrowingEvent, eventData, hObject)
  handles = guidata(hObject)
  % a bunch of stuff happens, including updates to the handles structure
  guidata(hObject, handles);

在我看来,区别在于我要传入hObject并在侦听器中从hObject查找句柄。即使侦听器是异步的,它也正在传递给hObject,我认为它只是指向图形的当前状态,而不是某些本地未更新的副本。

如果这对您有用,我会很好奇。到目前为止,它似乎在我的代码中仍然有效。

答案 1 :(得分:0)

一般情况下,如果您希望从一个回调中调用一个函数来修改handles,然后让这些更改可用于调用函数,那么您不仅需要保存调用函数中的handles结构(以便它们可用于其他回调),但是你必须在调用函数中重新加载handles结构,否则调用函数只是简单地使用它& #39;自己的handles本地(并且未经修改)副本,因为它无法知道它已被修改。

function main_callback(hObject, eventData, handles)

    % Set the value to one thing
    handles.value = false;

    sub_callback(hObject, eventData, handles);

    % Check that the value is STILL false
    disp(handles.value)

    % Load in the change so that handles gets updated
    handles = guidata(hObject);

end

function sub_callback(hObject, eventData, handles)
    handles.value = true;

    % Save the value
    guidata(hObject, handles);
end

另一个选择是让你的其他功能返回修改后的handles

function handles = sub_callback(hObject, eventData, handles)
    handles.value = true;

    guidata(hObject, value);
end

然后在调用函数中,您可以使用输出参数覆盖本地handles变量

handles = sub_callback(hObject, eventData, handles);

现在讨论关于addlistener的具体问题,因为回调是在"异步"中执行的。感觉,返回一个值并没有多大意义。我建议的是重新加载handles数据(如第一个示例所示),然后再次使用handles(您希望更改它)以确保您拥有最新版本。