我正在使用GUI Layout Toolbox以及EasyGUI中的MATLAB file exchange来开发我的GUI。我使用GUI Layout Toolbox创建了6个标签,我想在6个标签之一中使用EasyGUI的功能(例如下拉菜单,按钮等)(比如标签#2) 。我怎么能这样做?
执行以下操作会弹出两个不同的数字,这不是我想要的:
fh = figure('Units', 'normalized', ...
'OuterPosition', [0.1 0.2 0.4 0.4], ...
'Toolbar', 'none', 'Menu', 'none');
% ------------------Create Tabs---------------------
p = uiextras.TabPanel('Parent', fh); % Tab Component
Tab1 = uiextras.HBox('Parent', p); % 1st Tab
Tab2 = uiextras.HBox('Parent', p); % 2nd Tab - Horiz Box
Tab3 = uiextras.HBox('Parent', p); % 3rd Tab - Horiz Box
Tab4 = uiextras.HBox('Parent', p); % 4th Tab - Horiz Box
Tab5 = uiextras.HBox('Parent', p); % 5th Tab - Horiz Box
Tab6 = uiextras.HBox('Parent', p); % 6th Tab - Horiz Box
myGui = Tab2;
freq1 = gui.slider('Frequency 1 (Hz)', [1 40]);
freq2 = gui.slider('Frequency 2 (Hz)', [1 40]);
phaseDiff = gui.numericmenu('Phase difference (degrees)', 0:30:180);
plotType = gui.textmenu('Lissajous plot type', {'2d-phase', '2d-comet'});
答案 0 :(得分:3)
基于对EasyGUI代码的仔细阅读,看起来gui.manualgui
和gui.container
旨在使用整个图窗口作为GUI的父级,而不是任何其他uicontainer
。 (也许我错了,但除了gui.container
和autogui
之外,我没有看到任何其他文件继承manualgui
。
但是,看起来我们很幸运! gui.container
代码在其构造函数中包含以下内容:
elseif ishandle(uihandle) && strmatch(get(uihandle,'type'), ...
{'figure', 'uipanel', 'uicontainer', 'uiflowcontainer', 'uigridcontainer'})
obj.UiHandle = uihandle;
这意味着可能会创建gui.container
对象作为uipanel
对象的子对象。我修改了gui.manualgui
构造函数以接受句柄图形对象并创建一个新的uipanel
对象而不是figure
,然后将其传递给它的超类构造函数:
function obj = manualgui(hg)
if exist('hg', 'var')
h = uipanel(...
'Parent', hg);
else
h = figure(...
'Name', 'gui.manualgui', ...
'BackingStore' , 'off', ...
'DockControls' , 'off', ...
'NumberTitle' , 'off', ...
'MenuBar' , 'none', ...
'Resize' , 'on', ...
'Visible' , 'on', ...
'WindowStyle' , 'normal');
end
obj@gui.container(h);
end
然后,我在gui.container
构造函数中添加了一些代码,以说明数字的某些属性(即Color
)不是uipanels
的属性(即BackgroundColor
}):
function obj = container(uihandle)
if ~exist('uihandle', 'var')
obj.UiHandle = figure();
elseif ishandle(uihandle) && strcmp(get(uihandle, 'tag'), 'EasyGUIContainer')
% return the existing instance
obj = get(uihandle, 'userdata');
return;
elseif ishandle(uihandle) && strmatch(get(uihandle,'type'), ...
{'figure', 'uipanel', 'uicontainer', 'uiflowcontainer', 'uigridcontainer'})
obj.UiHandle = uihandle;
else
throw(MException('container:InvalidHandle', 'Invalid HG handle'));
end
% Backgroundcolor is the same as used by GUIDE
if ishandle(uihandle) && strcmp(get(uihandle,'type'), ...
'uipanel')
set(obj.UiHandle, 'units', 'pixels', ...
'tag', 'EasyGUIContainer', ...
'backgroundcolor', [0.8314 0.8157 0.7843], ...
'userdata', obj, ...
'DeleteFcn', @(h,e) delete(obj));
else
set(obj.UiHandle, 'units', 'pixels', ...
'tag', 'EasyGUIContainer', ...
'color', [0.8314 0.8157 0.7843], ...
'userdata', obj, ...
'DeleteFcn', @(h,e) delete(obj));
end
end
我只是试图在你的例子中实例化freq1
对象;这是因为我现在使用gui.manualgui
对象而不是gui.autogui
对象。您可以将其扩展为autogui
;我现在没有,因为我即将离开工作,我有MATLAB可用,这是一个不那么重要的事情。这是我做过上述修改后用于制作此图的最终代码:
fh = figure('Units', 'normalized', ...
'OuterPosition', [0.1 0.2 0.4 0.4], ...
'Toolbar', 'none', 'Menu', 'none');
% ------------------Create Tabs---------------------
p = uiextras.TabPanel('Parent', fh); % Tab Component
Tab1 = uiextras.HBox('Parent', p); % 1st Tab
Tab2 = uiextras.HBox('Parent', p); % 2nd Tab - Horiz Box
Tab3 = uiextras.HBox('Parent', p); % 3rd Tab - Horiz Box
Tab4 = uiextras.HBox('Parent', p); % 4th Tab - Horiz Box
Tab5 = uiextras.HBox('Parent', p); % 5th Tab - Horiz Box
Tab6 = uiextras.HBox('Parent', p); % 6th Tab - Horiz Box
myGui = gui.manualgui(Tab2);
freq1 = gui.slider('Frequency 1 (Hz)', [1 40], myGui);
% freq2 = gui.slider('Frequency 2 (Hz)', [1 40]);
% phaseDiff = gui.numericmenu('Phase difference (degrees)', 0:30:180);
% plotType = gui.textmenu('Lissajous plot type', {'2d-phase', '2d-comet'});
这是结果:
显然,由于我使用manualgui
而不是autogui
,您必须自己手动放置滑块,或修改autogui
以使其使用正确的手柄图形对象。