1

我的 GUI 的回调中有几个函数(在单独的文件中定义),如下所示:

function myFunction_Callback(hObject, eventdata, handles)
[output] = function1(input);
[output] = function2(input);
[output] = function3(input);
guidata(hObject, handles);

现在,假设我正在定义 function1,并且我想在句柄中存储一个局部变量。当我这样做时:

[output] = function1(input)
localVariable = [1 2 3];
handles.myVariable = localVariable;

handles.myVariable一旦 function1 完成,句柄就会“消失”。如何让它“留在”手柄中?我是否必须将其定义为输出,然后存储在这样的句柄中:

[output, localVariable] = function1(input)
...
localVariable = [1 2 3];

然后

function myFunction_Callback(hObject, eventdata, handles)
[output, handles.myVariable] = function1(input);
[output] = function2(input);
[output] = function3(input);
guidata(hObject, handles);

?? 我知道这个问题听起来超级愚蠢而且可能不清楚,但请原谅我,我对 GUI 和处理新手很困惑 :) 谢谢!

4

2 回答 2

1

是的,您的一般方法是可以的,尽管有一些事情:

  • handles通常是指包含对象句柄的数据结构。向其中添加其他类型的数据是有效的,但不建议这样做,因为它只会令人困惑。

  • 函数的单个输出周围的括号不是必需的。诚然,这是品味和编码风格的问题,但我不建议这样做;仅使用括号将属于一起的事物分组。

  • 你在某处input包含吗?handles同样,函数outputs 是否包含 的修改版本handles?如果没有函数修改handles,当然不需要每次调用回调时都重新保存...

所以,总而言之,做这样的事情:

function myFunction_Callback(hObject, eventdata, handles)
    ...
    output = func1(input);  
    output = func2(output);  
    output = func3(output);
    ...
    guidata(hObject, output);  % <-- NOTE: output contains handles


function output = func1(input)
    ...
    output.handles = input.handles;
    ...
    output.localVar = [1 2 3];
    ...
于 2012-11-05T06:50:11.057 回答
1

围绕这些函数传递数据可能会非常痛苦。

我发现针对这些原因应用面向对象编程非常有帮助。特别是将您的课程定义为classdef myclass < handles. 使用这些你可以轻松地做各种很酷的事情——比如在不相关的人物之间传输数据。

实现单例模式而不是全局模式很有帮助。我还在这里给出了一个显示观察者模式的答案。

于 2012-11-05T11:02:08.640 回答