我尝试在GUI中加载并显示图像。 之后我激活datacursormode。现在我想从我的datacursor对象中提取位置,并将信息保存到全局变量中以处理这些数据。
这是我的代码:
function varargout = myGui(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @myGui_OpeningFcn, ...
'gui_OutputFcn', @myGui_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before myGui is made visible.
% Choose default command line output for myGui
handles.output = hObject;
path = uigetimagefile;
img = imread(path);
axes(handles.axes1);
imshow(img);
dcm_obj = datacursormode(handles.figure1);
datacursormode on;
set(dcm_obj,'UpdateFcn', @myupdatefcn );
handles.pos = hObject;
handles.pos = get(0,'userdata');
set(handles.txt1,'String',num2str(handles.pos));
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = myGui_OutputFcn(hObject, eventdata, handles)
% Get default command line output from handles structure
varargout{1} = handles.output;
在一个额外的.m文件中,我有' myupdatefcn'喜欢这个
function txt = myupdatefcn(~, event_obj)
posi = event_obj.Position;
disp(['You clicked X:',num2str(posi(1)),', Y:',num2str(posi(2))]);
txt = {'Point to Compute'};
set(0,'userdata',posi(1));
end
任何人都可以解释我如何做到这一点吗?
感谢
答案 0 :(得分:0)
你的GUI组织似乎有点混乱。您需要小心将额外代码放在GUIDE生成的.m
文件中。
我建议您通过调用自己的初始化函数替换放在函数中间的所有代码:
myGuiInitialization(handles) ;
然后,在同一个文件中(在底部),添加以下代码:
function myGuiInitialization(handles)
% path = uigetimagefile; %// uncomment that to retrieve your intital functionality
% img = imread(path); %// uncomment that to retrieve your intital functionality
img = imread('peppers.png') ; %// Delete that to retrieve your intital functionality
himg = imshow(img, 'Parent',handles.axes1) ; %// get the handle of the image graphic object (needed to attach the datatip to it)
dcm_obj = datacursormode(handles.figure1); %// get the handle of the datacursor object
set(dcm_obj,'UpdateFcn', @myDatatipUpdateFcn ); %// assign it a callback
dcm_obj.createDatatip(himg) ; %// create a new DATATIP and attach it to the image object
这将加载图像,创建数据提示并将回调关联到它。
管理数据提示更新的单独功能变为:
function txt = myDatatipUpdateFcn(hobj, event_obj)
handles = guidata( event_obj.Target ) ; %// retrieve the collection of GUI graphic object handles
pointPosition = event_obj.Position; %// get the position of the datatip
%// Store the position in the figure "appdata", named "pointPosition"
setappdata( handles.figure1 , 'pointPosition' , pointPosition )
%// now we've saved the position in the appdata, you can also display it
%// on the datatip itself
txt = {'Point to Compute: ';...
['X:',num2str(pointPosition(1))]; ...
['Y:',num2str(pointPosition(2))] } ;
现在每次移动数据提示时,最后一个点位置将保存在图 AppData 中。我建议您使用功能setappdata
和getappdata
而不是旧版userdata
(它已成为过去,如果可以的话,请避免使用)。
特别是,您的方式是,不建议分配对象userdata
的{{1}},因为它将存储在主根对象中。如果你关闭你的gui,这些数据可能仍然存在。 0
会将附加的数据存储到您的GUI ,这是一种更清晰的方式(当你的gui关闭时,数据会随你的gui消失)。
现在,当您想要对AppData中保存的积分位置执行某些操作时,您只需使用setappdata
检索它们。
为了这个例子的目的,我在图上创建了一个按钮。按下时,它将检索点位置并将其显示在文本框中。
当你创建按钮时,GUIDE将在gui main函数中为它创建一个空回调。将以下代码放入其中:
getappdata
此代码将生成类似的内容:
datatip标签将在每次移动时更新位置,但只有按下按钮时才会更新底部的文本标签。