2010-05-25 7 views
2

GUI가 필요한 객체 지향 MATLAB 응용 프로그램을 가지고 있으며 레이아웃 (적어도)에 GUIDE를 사용하고 싶습니다. 나는 수동 방식으로 시도해 보았고 컨트롤 위치 지정을하는 것은 너무 고통 스럽다.GUIDE를 객체 지향 MATLAB과 함께 사용 하시겠습니까?

저는 GUIDE가 절차 중심적임을 알게되었습니다. 경로에서 실행되어 어떤 클래스 나 객체와도 연관되지 않는다고 가정하는 M- 파일을 생성합니다.

GUIDE를 객체 지향적으로 사용 해본 경험이있는 사람이 있습니까? 간단하다면 자동 코드 생성도하고 싶지만 GUIDE가 .fig 파일을 생성하고 코드를 직접 작성하게 할 수 있습니다.

답변

7

가이드가 포함 된 gui를 만들 때 모든 단추/텍스트 상자/그래프 등을 창에 배치 할 때 필요한 콜백을위한 셸을 자동으로 생성하므로 코드를 작성하기 만하면됩니다. 위젯 이름 ("태그")을 변경하거나 추가 또는 삭제하면 m- 파일이 업데이트되어 편리합니다.

gui를 개체와 연결하십시오. 자동 생성 된 m-파일이

function YourGUIName_OpeningFcn(hObject, eventdata, handles, varargin) 

당신이 필요로 할 수처럼 누군가가 오브젝트 당신의 GUI를 통과 할 것으로 보인다 또는 varargin을 통해 객체 함수 개요가 있습니다. 이 작업을 수행하는 표준을 MATLAB 방법은 매개 변수 이름/값 쌍을 전달하는 것입니다, 그래서 명령 줄에서 호출

YourGuiName('importantobject', object1); 

처럼 보일 것입니다하지만 당신은 또한 (단지 하나의 고유 한 인수가 특히) {varargin을 가정 할 수있다 1} 특정 매개 변수가, varargin는 {2} 두 번째이기 때문에이 경우

에, 명령 줄에서 호출

당신의 openingfcn에서
YourGuiName(object1); 

, 당신은 다음을 추가 할 것 line like

if (length(varargin) < 1) || ~isa(varargin{1}, 'importantObjectType') 
    error ('you must pass an importantobject to YourGuiName, see help'); 
end 
myimportantobject = varargin{1} 

이제 선택을 할 수 있습니다. 당신의 GUI에 데이터를 저장하는 canonically 올바른 방법은,

handles.myobject = varargin{1}; 
guidata(hObject, handles); %this is just boilerplate 

, 그 이름에도 불구하고, 핸들 손잡이 서브 클래스하지 않기 때문에 보일러가 필요 같이 핸들 구조에 넣어 다음 guidata로 저장하는 것입니다 참조가 아닌 값으로 전달됩니다. guidata 명령은 gui 그림과 연결된 어딘가에 핸들을 붙입니다. 따라서 후속 콜백에서 핸들을 얻을 수 있습니다.

이 방법의 문제점은 핸들에 큰 개체를 놓으면 guidata 명령이 오래 걸릴 수 있다는 것입니다. 이것은 절대적으로 필요하지 않으면 MATLAB이 값을 전달할 때 데이터를 복사하지 않아도되며, 객체가 4 바이트를 앞뒤로 통과하는 Handle 인 경우에도 마찬가지입니다. 왜 그런지 묻지 말고, 메모리 관리와 관련이 있다고 생각합니다. & 쓰레기 수거.

당신의 GUI는 명령을 실행하는 데 시간이 걸리는 경우, 당신은 프로필을 사용하고는 guidata 명령에 매달려 볼, 당신은 단지 그 방법

global YOURGUI_object; %it's not my fault; blame MATLAB 
YOURGUI_object = varargin{1}; 
을 세계가 될 개체를 선언하고이를 처리한다

그러면 모든 콜백이 YOURGUI_OBject의 필요한 모든 메소드를 실행하게 할 수 있습니다.

행운을 빈다.

+0

입력 해 주셔서 감사합니다. Marc. GUIDE의 자동 생성 된 M- 파일에는 초기화 코드에 "이 코드를 편집하지 마십시오"라는 큰 무서운 경고가 있습니다. 그래서 입력 인수를 망치 려하지 않았습니다. 이 경고는 무시합니까? 나는 그것이 자동 생성 루틴이나 그와 같은 것을 무너 뜨릴 것이라고 생각했다. – jjkparker

+0

주요 기능에이 %가 초기화 코드를 시작처럼 보이는 당신이 엉망 허용하지 않는 부분 - 코드 % 최종 초기화 코드를 편집하지 마십시오 - 다른 아무것도 편집하지 마십시오 편집 할 공정한 게임이다 . create fcns가있는 경우 시작시에 호출되므로 삭제하지 마십시오. 원하는 경우 모든 코드를 삭제할 수 있습니다. 그것 이외에, 그것에 가지고있다 – Marc

+0

좋아, 잘, 여기있다. GUIDE에서이 GUI를 만들고 객체로 나타내도록하고 싶습니다. 따라서 생성자에서 GUIDE 생성 M 파일은 MyGui (obj, varargin) 구문을 사용하여 호출해야합니다. 편집하지 말아야하는 초기화 코드를 편집해야합니다. MyGui를 정적 함수로 만들 수는 있지만 내 객체 데이터에 액세스 할 수는 없습니다. 나는 진정으로 "객체 지향적 인"것들이 콜백을 메소드로 필요로한다는 느낌을 갖기 때문에 어쨌든 내 자신의 코드를 작성해야 할 수도 있습니다. – jjkparker