0

我有一个问题要问这里的 MATLAB 大师..

所以这是我的代码(只显示与这里的问题相关的代码行):

mainProcess(hObject, handles)

handles.Checkpoint2 =1;
guidata(hObject, handles);

function testGUI1_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
handles.Checkpoint1 = 1;
mainProcess(hObject, handles);
handles.Checkpoint3 = 1; //EDIT: Checkpoint2 is also not visible at this line
guidata(hObject, handles);
handles.Checkpoint4 = 1;


function saveAndContinueButton_Callback(hObject, eventdata, handles)

(breakpoint here) --> faceDatabase(handles.currentImageIteration).lookingTowardsCamera=handles.lookingAtCamera;

因此,在上面的代码中,我在代码的不同部分创建了这些“检查点”,并在分别单击保存和继续按钮时查看其中哪些是可见的......在调用我的名为 mainProcess 的自定义函数之前创建检查点 1 , Checkpoint2 是在 mainProcess 的代码中创建的,Checkpoint3 是在 mainProcess 执行完成后创建的,并且控制权返回到调用它的函数,即 testGUI1_OpeningFcn ...并且 Checkpoint4 是在 testGUI1_OpeningFcn 中创建的,但是在句柄结构之后是在 testGUI1_OpeningFcn 代码中更新..

所以我的问题是,当单击按钮并且我看到此时可见的内容时,检查点 1 和 3 对按钮回调代码可见,但检查点 2 和 4 不可见......我知道检查点 4 不是可见,因为它是在 testGUI1_OpeningFcn 的代码中更新了句柄结构之后创建的……但是为什么 Checkpoint2 不可见,即使在 mainProcess 代码的末尾,我确实放了一行:

guidata(hObject, handles);

我的意思是 mainProcess 函数正在获取对 hObject 和句柄的引用,因此它应该具有对它的写访问权限,对吗?

那么为什么按钮的回调代码看不到 Checkpoint2 .. 呢?

有什么线索吗?

编辑:我只是想看看 Checkpoint2 是否在 mainProcess 的调用函数中可见,在控件返回调用者之后,即使 Checkpoint2 不可见(参见上面代码中的编辑)..

4

2 回答 2

3

没错,您需要调用 guidata 来更新您拥有的 handles 变量。但是,guidata 需要一个参数。我认为正确的命令是:

handles = guidata(hObject);  

您可能会发现此链接很有帮助:

http://www.mathworks.com/matlabcentral/answers/10197-guidata-doesn-t-work-the-way-i-expected-it-to

于 2012-01-30T23:53:31.180 回答
0

我相信您需要在调用 mainProcess() 之后添加以下内容

handles = guidata();

通常,“handles”结构按值传递给 guidata() 函数。因此, mainProcess() 不能更改句柄结构——只需将现有结构附加到句柄即可。在进行进一步修改之前,您需要取回它(使用handles=guidata()),更新它并使用guidata(h,handles)再次设置它。

让我知道这是否不够清楚(或者只是不起作用:)

编辑

您需要像这样更改代码:

function testGUI1_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
handles.Checkpoint1 = 1;
mainProcess(hObject, handles);
handles = guidata();   // <--- new line

handles.Checkpoint3 = 1; //EDIT: now checkpoint2 will be visible here
guidata(hObject, handles);

handles.Checkpoint4 = 1;
guidata(hObject, handles); // Otherwise Checkpoint4 will not be bound to hObject
于 2011-04-29T06:31:46.537 回答