【问题标题】:getappdata returning empty matrix in MATLABgetappdata在MATLAB中返回空矩阵
【发布时间】:2013-08-20 08:58:58
【问题描述】:

我有一段代码在其中使用setappdata,然后我使用getappdata 调用数据,即使它不是空的,它也会返回一个空的matirx。我的一段简化代码如下:

function edit1_Callback(hObject, eventdata, handles)

C=str2double(get(hObject,'String'))
setappdata(hObject,'H',C)

% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

N=getappdata(hObject,'H')

当我运行代码时,我在editbox 中输入一个值,然后推送pushbutton,我得到以下输出

C =

     5


N =

     []

我想要以下输出

C =

     5


N =

     5

我应该解释一下,我正在使用 getappdatasetappdata,因为我想在不同的 GUI 之间传递数据,并且在执行此操作时遇到了空矩阵问题。所以这是我最终目标的一个非常简化的问题。我还阅读了很多不同的文章以及有关此问题和命令的信息,包括 mathworks 网站,但我对这个问题非常迷茫。

【问题讨论】:

    标签: matlab user-interface matlab-guide


    【解决方案1】:

    首先,让我们解释一下发生了什么。

    edit1_Callback 内,您将setappdata 应用到hObject。此时hObject 指的是edit1,即编辑框,并且您已将其应用程序数据值H 设置为5。

    那么你在pushbutton1_Callback 中调用getappdata。此时hObject 引用pushbutton1,你得到它的应用程序数据值H,它从未被设置,所以你得到[]

    先前的答案建议您改为在根对象 0 上使用 setappdatagetappdata。这会起作用,但它与使用全局变量基本相同,这是 BAD。

    相反,我建议您很可能只想确保您在正确的事物上设置和获取应用程序数据。在edit1_Callback 内,尝试:

    setappdata(handles.edit1,'H',C)
    

    pushbutton1_Callback 内,尝试:

    N=getappdata(handles.edit1, 'H')
    

    我认为这应该可以工作(它假设编辑框实际上被称为edit1,我认为这很可能是由于您的 GUIDE 生成的代码,但如果您将其称为其他名称,请更改它)。

    【讨论】:

    • 我认为使用0 的美妙之处在于可以通过使用不同的名称从一个句柄访问我的所有变量。但我选择不使用全局变量是有原因的,所以我认为 Sam 给出的这个答案更适合我。谢谢
    • 如果你愿意,你可以通过将所有内容存储在 GUI 主图的 appdata 中来获得一种中途方法,无需真正的全局变量(如果你有多个窗口,请选择一个将在应用程序的整个生命周期内始终存在)。然后数据将是“GUI 的全局”,但实际上不是全局的。如果您发现将句柄传递给 GUI 图形很麻烦。为其Tag 属性分配独特的东西,然后使用h=findobj('Tag','something') 在任何你喜欢的地方检索它的句柄。
    • 我实际上在使用handles.edit1 而不是0 时遇到问题,在使用0 时尝试在GUI 之间传递数据时它工作正常,但在使用handles.edit1handles.*appropiateTag*i 时得到Reference to non-existent错误
    • 没错。 handles 是 GUIDE 为每个 GUI 创建的变量,一个 GUI 的句柄不会出现在另一个 GUI 的 handles 变量中。此外,它不包含由 Tag 命名的字段,它包含具有组件名称的字段,因此 handles.*Tag* 将不起作用。要跨多个 GUI 工作,您需要在它们之间显式传递任何必要的句柄,或者按照我的建议设置所有内容的 Tag 属性并使用 findobj。 (一般建议:使用 GUIDE 制作多窗口 GUI 是一种痛苦的体验)。
    【解决方案2】:

    您可以使用0 代替hObject。它会在根工作区读/写你的变量 H。

    setappdata(0,'H',C);
    getappdata(0,'H');
    

    【讨论】:

    • 这会起作用,但基本上与使用全局变量相同,这通常是个坏主意。请参阅下面的答案以获取替代建议。
    • 感谢@SamRoberts 提供的额外信息,您的建议很无聊,非常感谢。但是再次感谢 Magla,这个解决方案确实有效。
    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    相关资源
    最近更新 更多