user-interface - 如何在 GUI Layout Toolbox 创建的选项卡中使用 EasyGUI 的功能?

标签 user-interface matlab

我正在使用 GUI Layout Toolbox以及EasyGUI来自 MATLAB file exchange开发我的图形用户界面。我使用 GUI Layout Toolbox 创建了 6 个选项卡我想使用 EasyGUI 的功能(例如下拉菜单、按钮等)在 6 个选项卡之一(比如 Tab#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'});

最佳答案

根据对 EasyGUI 代码的仔细阅读,它看起来像 gui.manualguigui.container旨在使用整个图形窗口作为 GUI 的父级,而不是任何其他 uicontainer。 (也许我错了,但除了 autoguimanualgui 之外,我没有看到任何其他子类 gui.container 的文件。

不过,看来我们很幸运! gui.container 代码在其构造函数中包含以下内容:

elseif ishandle(uihandle) && strmatch(get(uihandle,'type'), ...
        {'figure', 'uipanel', 'uicontainer', 'uiflowcontainer', 'uigridcontainer'})
    obj.UiHandle = uihandle;

这意味着存在这样一种情况,其中可以将 gui.container 对象创建为 uipanel 对象的子对象。我修改了 gui.manualgui 构造函数以接受一个句柄图形对象并创建一个新的 uipanel 对象而不是 figure,然后将它传递给它父类(super class)构造函数:

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 构造函数中添加了一些代码,以说明 Figures 的某些属性(即 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'});

结果如下:

EasyGUI widget on top of a GUI Layout Toolbox HBox

显然,由于我使用的是 manualgui 而不是 autogui,您必须自己手动放置 slider ,或者将 autogui 修改为使其使用正确的句柄图形对象。

关于user-interface - 如何在 GUI Layout Toolbox 创建的选项卡中使用 EasyGUI 的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17074924/

相关文章:

matlab - 如何绘制信号流图

javascript - 选择带有空格的 jQuery 插件搜索

java - 检测 JSpinner 何时达到最大限制?

java - 无法使用 netbeans GUI 生成器调用 UI 类

regex - 文本编辑器中的正则表达式提取

python - 我们可以只计算一个非常大的稀疏矩阵的第 n 个特征值和特征向量吗?

matlab - 如何计算日出和日落时间(matlab)?

matlab - 如何在matlab中有效地构造一个依赖于索引的矩阵

android - 让一个元素填充基于wrap_content的布局中的所有可用空间

javascript - javascript 中的克罗内克张量积