【问题标题】:MATLAB GUI: Slider as scrollbar; subpanel doesn't clipMATLAB GUI:滑块作为滚动条;子面板不剪辑
【发布时间】:2014-08-20 09:01:46
【问题描述】:

潜伏已久——我非常感谢社区的知识。我已经在这里和其他地方多次看到这个问题,尽管我还没有找到合适的解决方案。如果我错过了之前列出的答案,请发布链接并接受我的道歉。

我的 GUI 图有一个主面板,顶部有一个 uibuttongroup 作为选项卡。每个选项卡都可以查看不同的超大子面板(填充了各种内容),我使用滑块上下滚动子面板。

一般来说,这是可行的。但是,当我向下滚动时,子面板的内容(而不是子面板本身)会覆盖顶部的选项卡(应该始终可见)。我认为这可能与剪辑有关,但我不知道如何使它起作用。有人知道如何防止这种情况发生吗?

我已包含代码(为简洁起见,功能有限):

function h = ScrollQuestion_StackOverflow


h.myFig = figure('position', [100 100 800 600],...
    'menubar','none');


%% Panel covers full figure
h.Main_Panel = uipanel('Parent', h.myFig,...
    'units','normalized',...
    'position', [0 0 1 1],...
    'visible','on');


%% ALWAYS needs to be visible by the user, not covered by anything
h.Main_BtnGrp = uibuttongroup('parent', h.Main_Panel,...
    'units','normalized',...
    'position', [0 .95 1 .05]);

h.Tab1_TglBtn = uicontrol('parent', h.Main_BtnGrp,...
    'units','normalized',...
    'position', [0 0 .125 1],...
    'style','togglebutton',...
    'string', 'Tab1');

h.Tab2_TglBtn = uicontrol('parent', h.Main_BtnGrp,...
    'units','normalized',...
    'position', [.125 0 .125 1],...
    'style','togglebutton',...
    'string', 'Tab2');


%% Oversized sub-panel
h.ThisPanelMoves = uipanel('parent',h.Main_Panel,...
    'units','normalized',...
    'position', [0 -1 1 1.95]);

% Generic content of sub-panel
h.ContentText = uicontrol('parent', h.ThisPanelMoves,...
    'units','normalized',...
    'position', [.05 .95 .8 .05],...
    'style','text',...
    'string', 'BLOCKS TABS WHEN YOU SCROLL DOWN',...
    'fontsize', 20,...
    'clipping','on');


%% Add slider
h.Tab1_Slider = uicontrol('Parent', h.myFig,...
    'units','normalized',...
    'position',[.98, 0 .02 1],...
    'style', 'slider',...
    'value', 1,...
    'callback', {@SliderCallback, h});

guidata(h.myFig,h)


%% Slider Callback
function SliderCallback(hObject, eventdata, h)
    val = get(hObject,'Value');
    set(h.ThisPanelMoves, 'Position', [0 -val 1 1.95]);

非常感谢您的帮助!

【问题讨论】:

  • 虽然我并不完全满意,但我找到了一个解决方法:似乎创建顺序决定了哪个项目在顶部。如果我首先创建超大子面板,然后创建 uibuttongroup,那么当我向下滚动时,选项卡位于顶部。视觉效果仍然不是很漂亮,但它似乎可以工作。
  • 如果有人 (1) 知道如何清理视觉效果 [我宁愿子面板内容不通过 uibuttongroup 框架显示] 或 (2) 知道如何“将项目放在前面”无论创作顺序如何,我都会非常感激。

标签: matlab user-interface slider scrollbar clipping


【解决方案1】:

uistack() 将允许您调整 uicontrol 对象的顺序。孩子似乎不会继承父母的位置,因此您不能只是将面板移到顶部并收工。为每个选项卡切换调用它会得到所需的结果。

uistack(h.Tab1_TglBtn,'top');
uistack(h.Tab2_TglBtn,'top');

它仍然会越过面板边界,因此您必须根据需要调整其他对象以获得更美观的 GUI。

我不能 100% 确定 uistack 正在修改哪些属性以调整对象顺序,如果您执行 open uistack,代码就会出现,但我没有机会查看它以查看是什么继续。

【讨论】:

    【解决方案2】:

    改变你的功能:

    function SliderCallback(hObject, eventdata, h)
        val = get(hObject,'Value');
        set(h.ThisPanelMoves, 'Position', [0 -val 1 1.95]);
    end
    

    为此:

    function SliderCallback(hObject, eventdata, h)
        val = get(hObject,'Value');
        set(h.ThisPanelMoves, 'Position', [0 -val 1 0.95]);
    end
    

    在您的代码中,移动面板的高度大于窗口大小(1.95,而窗口的限制为 1)。

    并在滑块中将最大和最小限制设置为“1”和“0”,以免发生圆周运动:

    %% Add slider h.Tab1_Slider = uicontrol('Parent', h.myFig,...
        'units','normalized',...
        'position',[.98, 0 .02 1],...
        'style', 'slider',...
        'value', 1, 'max', 1, 'min', 0,...
        'callback', {@SliderCallback, h});
    

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 2011-08-20
      相关资源
      最近更新 更多