2015-08-11 3 views
0

У меня есть два графических интерфейса с ярлыками mainWindow и annotatorWindow. Я хочу передать данные между двумя окнами. Когда я копирую данные из mainWindow в annotatorWindow (см. copyData_Callback), он работает отлично. Но когда я хочу записать данные обратно в mainWindow (см. saveData_Callback), я получаю сообщение об ошибке «Матричные индексы должны быть полными двойными». Я не совсем уверен, что это означает, любая помощь приветствуется. Ниже приведен код интереса.MATLAB: Передача данных между двумя графическими интерфейсами

CALLBACKS UNDER annotatorWindow 



% --- Executes on button press in copyData. 
function copyData_Callback(hObject, eventdata, handles) 
% hObject handle to copyData (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

h = findobj('Tag', 'mainWindow'); 

if ~isempty(h) 
    pData = guidata(h) 
    handles.UserData = pData.UserData 
end 

guidata(hObject, handles); 

return 

% --- Executes on button press in saveData. 
function saveData_Callback(hObject, eventdata, handles) 
% hObject handle to saveData (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

h = findobj('Tag', 'mainWindow'); 

if ~isempty(h) 
    guidata(h).UserData = handles.UserData 
end 

guidata(hObject, handles); 

return 
+1

Просьба (и читать) сообщение об ошибке целиком, это довольно ясно. Проблема не имеет ничего общего с передачей данных между графическими интерфейсами. Ваш вызов 'guidata' в' saveData' недопустим. Вы получаете ошибку, потому что MATLAB считает, что вы пытаетесь индексировать 'guidata' с помощью' h', который является объектом, а не целым числом, а 'guidata' - это функция, а не переменная. – excaza

ответ

0

Обдумал это! Чтобы передавать данные между двумя графическими интерфейсами, вы можете только вывести данные из графического интерфейса. Вы никогда не сможете записывать данные в графический интерфейс из другого графического интерфейса. Я создал функцию в mainWindow под названием saveData (см. Ниже). Затем я вызвал функцию saveData от annotatorWindow, что позволило мне передавать данные взад и вперед.

mainWindow 

function saveData(hObject, handles) 

h = findobj('Tag', 'annotatorWindow'); 

if ~isempty(h) 
    aData = guidata(h) 
    handles.UserData = aData.UserData 
end 

guidata(hObject, handles); 


return 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
annotatorWindow 

% --- Executes on button press in saveData. 
function saveData_Callback(hObject, eventdata, handles) 
% hObject handle to saveData (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

h = findobj('Tag', 'mainWindow'); 

annotatorGUI('saveData', h, guidata(h)); 

return 
+0

Это неправда: вы можете извлекать данные только из графического интерфейса. Вы никогда не сможете записывать данные в графический интерфейс другого графического интерфейса пользователя – excaza