【问题标题】:How to add progress bar control to Matlab gui?如何将进度条控件添加到 Matlab gui?
【发布时间】:2011-07-19 03:19:59
【问题描述】:

有没有现成的进度条uicontrol可以添加到matlab gui中, uicontrol 还是 ActiveX 组件?

[edit] 我知道 waitbar 功能,我的意思是可以在设计的 GUI 中实现的组件,而不仅仅是弹出窗口。状态栏中的电池状态之类的东西。

【问题讨论】:

  • ActiveX 不只适用于 Internet Exploder 吗?
  • 到 Blender:除了可以添加的给定 uicontrols 之外,您还可以在 Matlab 的 GUI 设计环境 (GUIDE) 中使用 ActiveX。
  • 啊,好吧。作为一个 Linux 人,我只知道 ActiveX 有时会利用 IE。

标签: user-interface matlab uicomponents


【解决方案1】:

对于仍然感兴趣的人,这是我使用类的解决方案:

classdef progressbar < handle
    properties(Access = protected)
        h_panel         % Panel on which everything sits
        h_ax            % The progress range axes
        h_pbar          % The bar representing progress (patch)
        h_ptext         % Percentage label
    end
    properties(Access = public, Dependent = true)
        range           % Progress range
        pvalue          % Current value
        percent         % Percentage complete (relative within range)
        position        % Position of the object (panel)
        ax_tag          % Tag of the axes
        visible         % Is the object (panel) visible?
    end
    properties(Constant = true)
        default_color = [.75 .75 .9];
    end
    methods
        % Initializer
        function obj = progressbar(fig, pos, range)
            if nargin < 3
                range = [0 1];
            end
            obj.h_panel = uipanel('Parent', fig, 'Units', 'Inches', ...
                'Position', pos, 'Tag', 'progbar_panel');
            obj.h_ax = axes('Parent', obj.h_panel, ...
                'Units', 'Inches', 'Position', [0 0 obj.position(3) obj.position(4)], ...
                'XTickLabel', '', 'XTick', [], 'YTickLabel', '', 'YTick', []);
            obj.h_pbar = patch([range(1) range(1) range(1) range(1)], [0 0 2 2], ...
                obj.default_color, 'Parent', obj.h_ax, 'Tag', 'progbar_patch');
            obj.h_ptext = text(obj.position(3)/2, obj.position(4)/2, '0%', ...
                'Parent', obj.h_ax, 'FontWeight', 'bold', 'Units', 'Inches', ...
                'HorizontalAlignment', 'center', 'Tag', 'progbar_text');
            obj.range = range;
            obj.ax_tag = 'progbar_ax';
        end

        % Property Access Methods
        function set.range(obj, value)
            % Instead of replotting, just reset the XLim to the
            % extremities of the input range. If the values are not
            % increasing, just default to [0 1].
            if value(end) > value(1)
                set(obj.h_ax, 'XLim', value([1,end]), 'YLim', [0 2]);
            else
                set(obj.h_ax, 'XLim', [0 1], 'YLim', [0 2]);
            end
            % Reset progress.
            obj.pvalue = value(1);
        end
        function value = get.range(obj)
            value = get(obj.h_ax, 'XLim');
        end
        function set.pvalue(obj, value)
            % Expects a single value to represent progress value and
            % constructs the selection rectangle from that. If multiple
            % values are passed in, all are ignored but the last, since the
            % left edge of the bar is always the first element of the
            % range.
            set(obj.h_pbar, 'XData', [obj.range(1) value(end) value(end) obj.range(1)], ...
                'FaceColor', obj.default_color);
            set(obj.h_ptext, 'String', sprintf('%3.0f%%', obj.percent * 100));
        end
        function value = get.pvalue(obj)
            % The progress bar is actually 2D, but we treat as if it is 1D.
            % Hence the XData is actually an array of four values but we
            % only consider the second (progress maximum).
            limits = get(obj.h_pbar, 'XData');
            value = limits(2);
        end
        function set.percent(obj, value)
            % Expects a single value between 0 and 1.
            limits = obj.range;
            obj.pvalue = value * (limits(2) - limits(1)) + limits(1);
        end
        function value = get.percent(obj)
            limits = obj.range;
            value = (obj.pvalue - limits(1)) / (limits(2) - limits(1));
        end
        function set.position(obj, value)
            set(obj.h_panel, 'Position', value);
        end
        function value = get.position(obj)
            value = get(obj.h_panel, 'Position');
        end
        function set.ax_tag(obj, value)
            set(obj.h_ax, 'Tag', value);
        end
        function value = get.ax_tag(obj)
            value = get(obj.h_ax, 'Tag');
        end
        function set.visible(obj, value)
            if (isnumeric(value) && value >= 1) || strcmp(value, 'on') == 1 || strcmp(value, 'On') == 1
                set(obj.h_panel, 'Visible', 'on');
            else
                set(obj.h_panel, 'Visible', 'off');
            end
        end
        function value = get.visible(obj)
            vis = get(obj.h_panel, 'Visible');
            value = strcmp(vis, 'on');
        end

        % Public member functions
        function increment(obj)
            % Don't use this if the range is less than 1.
            obj.pvalue = obj.pvalue + 1;
        end
        function display_text(obj, text, color)
            if nargin == 3 && ~isempty(color)
                set(obj.h_pbar, 'FaceColor', color);
            end
            set(obj.h_ptext, 'String', text);
        end
    end
end

像这样声明一个实例:pb = progressbar(gcf, [1 1], [0 20]);

它可以与相对或实际数字一起使用,即pb.pvalue = 10;pb.percent = .5; 在我的示例中执行相同的操作。

我的版本在进度条中间有一个文本对象,显示当前百分比。

我的最新版本可用here

【讨论】:

    【解决方案2】:

    还有另一种方法...抱歉,如果有人提到它,我错过了。您可以构建一个动态添加轴的图形。它可以很好地适应自定义应用程序。弹出窗口总是迷路或挡路。

    【讨论】:

    • 一个例子可以帮助回答这个问题
    【解决方案3】:

    另一个简单的解决方案是像这样使用两个嵌套的 uipanel:

    function MyProgressBar(handle, progress)
       % progress = 0.00001 .... 1
    
       % 1st panel
       p = uipanel(handle);
    
       % 2n panel as bar
       bar = uipanel(p);
        set(bar, 'BackgroundColor', 'red');
        x = get(bar, 'Position');
        x(3) = progress;       % Corresponds to % progress if unit = normalized
        set(bar, 'Position',x);
    end
    

    用法:

     f = figure();
     set(f,'Position',[100,100,400,40]);
     MyProgressBar(f, 0.5); % corresponds to 50% progress
    

    【讨论】:

      【解决方案4】:

      根据MatLab Newgroup 评论调整我的代码,我能够整理出以下内容:

      function h = uiProgressBar(varargin)
      %uiProgressBar: A waitbar that can be embedded in a GUI figure.
      
          if ishandle(varargin{1}) && size(varargin, 2) > 1
              ax = varargin{1};
              value = varargin{2};
              p = get(ax,'Child');
              x = get(p,'XData');
              x(3:4) = value;
              set(p,'XData',x)
              return
          end
      
          bg_color = 'w';
          fg_color = 'r';
          h = axes('Units','pixels',...
              'XLim',[0 1],'YLim',[0 1],...
              'XTick',[],'YTick',[],...
              'Color',bg_color,...
              'XColor',bg_color,'YColor',bg_color, ...
              'Parent', varargin{1});
          patch([0 0 0 0],[0 1 1 0],fg_color,...
              'Parent',h,...
              'EdgeColor','none',...
              'EraseMode','none');
      end
      

      创建如下,其中parent是你要添加到的父面板:

      myProgressBar = uiProgressBar(parent);
      

      更新进度条就这么简单:

      uiProgressBar(myProgressBar, .2);
      

      这是一个使用 figure 的完整工作示例:

      f = figure('Name', 'Progress Bar Example', 'Position', [100 100 800 600]);
      
      progressBar = uiProgressBar(f);
      
      for i = 1:10:100
          uiProgressBar(progressBar, i/100);
          pause(.5);
      end
      

      【讨论】:

      • 这是我迄今为止看到的最喜欢的解决方案。谢谢!我接受了这个想法并对其进行了大幅修改以满足我的需求,但最重要的是我将我的版本变成了一个类。
      • 这是迄今为止没有头痛的最佳答案。
      【解决方案5】:

      【讨论】:

        【解决方案6】:

        Waitbar 及其变体显示一个带有状态栏的弹出窗口。在大多数应用程序中,这是可以的,而且使用起来非常简单。

        如果您想在现有 GUI 窗口中集成进度条,您有多种选择:

        1. 实现内部等待条码 - 这实际上只是一个轴,显示一个彩色补丁,其宽度取决于进度值。
        2. 使用标准java.swing.JProgressBar,可以通过内置javacomponent function将其添加到您的Matlab GUI
        3. 使用StatusBar utility 或说明here 将进度条添加到GUI 窗口的状态栏

        所有这些选择都适用于所有 Matlab 平台。

        【讨论】:

        • 谢谢!这正是我所需要的。
        【解决方案7】:

        是的,有。 waitbar 函数正是您所需要的。那里的示例很容易理解,您可以立即开始。它应该可以在所有 3 个平台(Windows/OS X/Linux)上正常工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-15
          • 1970-01-01
          相关资源
          最近更新 更多