如何在MATLAB中将图像从GUI1传递到GUI2

时间:2017-03-19 15:29:12

标签: image matlab user-interface

这一定很容易,但由于某些原因我无法解决这个问题。 我所拥有的是2个GUI,即GUI1和GUI2。

在GUI1中,我按照A读取并存储了一个图像。它还有一个PushButton。现在,当我单击此按钮时,它应该在GUI2的轴1中显示该图像。

我尝试了setappdatagetappdata但最终却给出了错误。我无法理解语法。我是MATLAB的新手。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

setappdata / getappdata将在下面详细讨论。

如评论中所述,您可以使用setappdata(0, ... / getappdata(0, ...向/从根对象分配/读取数据。

  

摘自MATLAB User Interfaces - Passing Data Around User Interface。原作者是SueverHoki。归因详情可在contributor page上找到。该来源在CC BY-SA 3.0下获得许可,可以在Documentation archive中找到。参考主题ID:2883和示例ID:9775。

围绕用户界面传递数据

大多数高级用户界面要求用户能够在构成用户界面的各种功能之间传递信息。 MATLAB有许多不同的方法可以做到这一点。

guidata

MATLAB自己的GUI Development Environment (GUIDE)更喜欢使用名为struct的{​​{1}}来在回调之间传递数据。此handles包含各种UI组件的所有图形句柄以及用户指定的数据。如果您没有使用自动传递struct的GUIDE创建的回调,则可以使用guidata

检索当前值
handles

如果要修改存储在此数据结构中的值,则可以进行修改,但必须将其存储回% hObject is a graphics handle to any UI component in your GUI handles = guidata(hObject); ,以便其他回调可以看到更改。您可以通过指定guidata的第二个输入参数来存储它。

hObject

% Update the value handles.myValue = 2; % Save changes guidata(hObject, handles) 的值只要是同一hObject 中的UI组件就无关紧要,因为最终数据存储在包含的图中figure

最适合:

  • 存储hObject结构,您可以在其中存储所有内容 GUI组件的句柄。
  • 存储"小"大多数回调需要访问的其他变量。

不推荐

  • 存储不必由所有人访问的大变量 回调和子功能(使用handles / setappdata 这些)。

setappdata / getappdata

getappdata方法类似,您可以使用setappdatagetappdata来存储和检索图形句柄中的值。使用这些方法的优点是,您只能检索您想要的值而不是包含所有存储数据的整个guidata。它类似于键/值存储。

将数据存储在图形对象中

struct

并从不同的回调中检索相同的值

% Create some data you would like to store
myvalue = 2

% Store it using the key 'mykey'
setappdata(hObject, 'mykey', myvalue)

注意:如果在调用value = getappdata(hObject, 'mykey'); 之前没有存储任何值,则会返回一个空数组(getappdata)。

[]类似,数据存储在包含guidata的图中。

最适合:

  • 存储不必由所有人访问的大变量 回调和子功能。

UserData

每个图形句柄都有一个特殊属性hObject,它可以包含您想要的任何数据。它可以包含一个单元格数组,UserData,甚至是标量。您可以利用此属性并在此字段中存储您希望与给定图形句柄关联的所有数据。如果您使用R2014b或更新版本,则可以使用标准struct / get方法保存和检索图形对象或点符号。

set

然后在另一个回调中,您可以检索此数据:

% Create some data to store
mydata = {1, 2, 3};

% Store it within the UserData property
set(hObject, 'UserData', mydata)

% Of if you're using R2014b or newer:
% hObject.UserData = mydata;

最适合:

  • 存储范围有限的变量(可能仅由存储它们的对象使用的变量,或与其有直接关系的对象)。

Nested Functions

在MATLAB中,嵌套函数可以读取和修改父函数中定义的任何变量。这样,如果将回调指定为嵌套函数,它可以检索和修改主函数中存储的任何数据。

their_data = get(hObject, 'UserData');

% Or if you're using R2014b or newer:
% their_data = hObject.UserData;

最适合:

  • 小而简单的GUI。 (为了快速原型设计,不必实施function mygui() hButton = uicontrol('String', 'Click Me', 'Callback', @callback); % Create a counter to keep track of the number of times the button is clicked nClicks = 0; % Callback function is nested and can therefore read and modify nClicks function callback(source, event) % Increment the number of clicks nClicks = nClicks + 1; % Print the number of clicks so far fprintf('Number of clicks: %d\n', nClicks); end end 和/或guidata方法。

不推荐

  • 中型,大型或复杂的GUI。

  • 使用set/getappdata创建的GUI。

显式输入参数

如果您需要将数据发送到回调函数并且不需要修改回调中的数据,您始终可以考虑使用精心设计的回调定义将数据传递给回调。

您可以使用添加输入的匿名函数

GUIDE

或者您可以使用单元格数组语法指定回调,再次指定其他输入。

% Create some data to send to mycallback
data = [1, 2, 3];

% Pass data as a third input to mycallback
set(hObject, 'Callback', @(source, event)mycallback(source, event, data))

最适合:

- 当回调需要set(hObject, 'Callback', {@mycallback, data}) 执行某些操作但data变量不需要修改并保存在新状态时。