Возможно создание GUI-модуля самостоятельно. Возможно, вам придется хорошо отслеживать графические объекты, но это все равно для любого графического интерфейса.
Я предложу пример, показывающий один способ сделать это (есть еще несколько способов). Этот способ потребовал бы программного программирования вашего графического интерфейса (вы могли бы настроить его на GUIDE GUI, но для этого потребовалось бы много возиться, и я бы не рекомендовал его).
Основной подход заключается в функции, которые лежат вне «модуль» (создание и положение всех uicontrol
, axes
и т.д ...) в общего контейнера вместо figure
. Когда вам нужно загрузить модуль, вы можете просто создать контейнер (я использую в этом примере uipanel
) и загрузить модуль в этот контейнер. Если вы хотите изменить активный модуль, вы можете просто удалить контейнер (Matlab удалит все дочерние объекты), затем загрузите новый модуль в новый контейнер. В качестве альтернативы вы можете просто загрузить все модули, скрыть их все (установите 'visible','off'
на весь контейнер, а затем сделайте видимым только текущий модуль.
В этом примере три различные функции, которые определяют модуль, находятся в одном и том же (я лично использую приложение, которое имеет около 40 модулей, поэтому вы можете угадать, что их можно использовать в разных файлах).
Вот как это сделать Посмотрите, и код просто следуйте за ним:
Код для Modular_GUI_sample.m
: (Самый интересный раздел для вас в функции Module_Selection_callback
)
function h = Modular_GUI_sample
%// The main figure
h.figMain = figure('Name','Testing Module',...
'Menubar','none','Toolbar','none',...
'NumberTitle','off','Units','Normalized') ;
%// The Module Selection panel
h.ms = Create_Module_Selection_UI(h.figMain) ;
%// save the ui object handles structure
guidata(h.figMain , h)
function Module_Selection_callback(hobj, ~)
selectedModuleName = get(get(hobj , 'SelectedObject'), 'String') ;
%// retrieve the global handle structure
h = guidata(hobj) ;
%// Delete old module if present
if isfield(h,'hmod')
if ishandle(h.hmod.pnl) ;
delete(h.hmod.pnl) ; % delete the panel and children object
h.hmod = [] ; % clear the structure
end
end
%// The panel which will contain the selected module
spc = 0.05 ; % spacing value for margins
h.hmod.pnl = uipanel('Units','Normalized','Position',[spc spc (1-2*spc) (0.7-2*spc)],'BackgroundColor','w') ;
%// load new module
switch selectedModuleName
case 'Locomotion'
hmod = Load_Module_Locomotion(h.hmod.pnl) ;
case 'Vision'
hmod = Load_Module_Vision(h.hmod.pnl) ;
case 'Localization'
hmod = Load_Module_Localization(h.hmod.pnl) ;
end
%// save the ui object handles structure
h.mod = hmod ;
guidata(h.figMain , h)
function hmod = Load_Module_Locomotion(parent)
%// main container panel
hmod.pnl = parent ;
spc = 0.05 ;
hmod.list = uicontrol('Parent',parent,'Style','listbox','Units','Normalized','Position',[spc spc (1-2*spc) (1-2*spc)]) ;
set(hmod.list,'String',{'List Item 1','List Item 2','List Item 3'},'Value',1) ;
function hmod = Load_Module_Vision(parent)
%// main container panel
hmod.pnl = parent ;
hmod.ax1 = subplot(2,2,1,'Parent',parent) ;
hmod.ax1 = subplot(2,2,3,'Parent',parent) ;
hmod.ax1 = subplot(2,2,[2 4],'Parent',parent) ;
function hmod = Load_Module_Localization(parent)
%// main container panel
hmod.pnl = parent ;
spc = 0.05 ;
hmod.list = uicontrol('Parent',parent,'Style','pushbutton','String','A big push button','Units','Normalized','Position',[spc spc (1-2*spc) (1-2*spc)]) ;
function ms = Create_Module_Selection_UI(parent)
%// prepare position calculation helper
spc = 0.05 ; %// spacing value for margins
nButtons = 3 ;
btnH = (1-(nButtons+1)*spc)/nButtons ;
radioPos = @(k) [spc (1-(k*(spc+btnH))) (1-2*spc) btnH ] ;
%// The main "Module Selection" panel (actually a "uibuttongroup" object)
ms.pnl = uibuttongroup('Parent',parent,'Position',[spc 0.7 (1-2*spc) 0.3-spc],'BackgroundColor','w') ;
%// prepare properties which will be common for this group of uicontrols
radioProps = {'Parent',ms.pnl , 'Style','radiobutton' , 'Units','Normalized' } ;
%// Create three radio buttons in the button group.
k=0;
k=k+1 ; ms.radLocomotion = uicontrol(radioProps{:} , 'Position',radioPos(k) , 'String','Locomotion') ;
k=k+1 ; ms.radVision = uicontrol(radioProps{:} , 'Position',radioPos(k) , 'String','Vision') ;
k=k+1 ; ms.radLocalization = uicontrol(radioProps{:} , 'Position',radioPos(k) , 'String','Localization') ;
%// Initialize some button group properties.
set(ms.pnl,'SelectionChangeFcn',@Module_Selection_callback);
set(ms.pnl,'SelectedObject',[]); % No selection
Если вам нужно программно разработать обширный графический интерфейс, я призываю вас рассмотреть вопрос об использовании GUI Layout Toolbox из файлового обмена. Он достаточно прочный и делает разработку графического интерфейса в Matlab легким, по сравнению с тем, что он должен программно программировать (и изменять размер) все ваши элементы управления (вам не нужно будет делать все вычисления позиций, которые у меня есть в примере, например).
Вы проектируете это с помощью GUIDE или программно? – Suever
Прямо сейчас с GUIDE, но так как я только начал, я открыт для любого подхода. – Austin