扩展MATLAB uicontrol

时间:2013-03-08 16:35:03

标签: oop matlab user-interface

我想定制一些MATLAB uicontrols(例如下拉框),以便为他们提供更加用户友好的功能。

我的问题是:是否可以扩展/继承uicontrol?如果是这样,你怎么做?如果没有,是否有解决方法?

我尝试过这个基本代码只是为了设置它,但是我收到以下错误:

The specified super-class 'uicontrol' contains a parse error or cannot be found on MATLAB's search path, possibly shadowed by another file with the same name.

classdef ComboBox < uicontrol    
    methods(Access = public)
        function obj = ComboBox()
            set(obj, 'Style', 'popup');
        end 
    end
end

当我尝试将其添加到图中时发生错误:

cmb = ComboBox();
set(cmb, 'Parent', obj.ui_figure);

编辑:在考虑之后,我认为这将是一个不错的解决方法,但是,如果可能的话,我仍然想知道如何扩展uicontrol。

classdef ComboBox < uicontrol    
    properties(Access = public)
       Control;
    end

    methods(Access = public)
        function obj = ComboBox(parent, items)
            obj.Control = uicontrol();
            set(obj.Control, 'Style', 'popup');
            set(obj.Control, 'Parent', parent);
            set(obj.Control, 'String', items);
        end 
    end
end

1 个答案:

答案 0 :(得分:0)

  1. 没有记录方法(从R2013a开始)将子类写入MATLAB Handle Graphics 类。事实上,由于MATLAB存储hg对象的方式,我们甚至无法得到 一个hg对象的类很容易。例如:

    >> fig = figure();
    >> class(f)
    
    ans =
    
    double
    
    >> isa(f, 'figure')
    
    ans =
    
         0
    
    >> ishghandle(f)
    
    ans =
    
         1
    
  2. 对此的一个解决方案是编写一个子类handle
    的子类 hgsetget,并将uicontrol对象的句柄保存为私有属性。 例如:

    classdef ComboBox < hgsetget
        properties (Access = private)
            Control
        end
    
        properties
            % extend the functionality of your new uicontrol with additional
            % properties
            newProp1
            newProp2
        end
    
        properties (Dependent = true)
            % make any properties of uicontrol for which you want to still
            % allow access as dependent properties. define set and get methods
            % for these properties below
            fontSize
            foregroundColor
            backgroundColor
            items
        end
    
        methods
            function obj = ComboBox(parent, items)
                obj.Control = uicontrol(parent, 'Style', 'popup', ...
                    'String', items);
                % make sure to delete this object if you delete the uicontrol
                set(obj.Control, 'DeleteFcn', {@(source, eventData)delete(obj)})
            end
    
            % Define set and get methods for your new properties. These methods
            % will set the actual properties, and then modify the uicontrol in
            % some way
            function prop = get.newProp1(obj)
                prop = obj.newProp1;
            end
    
            function set.newProp1(obj, newVal)
                obj.newProp1 = newVal;
                % do something else
            end
    
            function prop = get.newProp2(obj)
                prop = obj.newProp2;
            end
    
            function set.newProp2(obj, newVal)
                obj.newProp2 = newVal;
                % do something else
            end
    
            % Define set and get methods for any uicontrol properties you wish
            % to retain. These methods will simply redirect calls to the
            % uicontrol object.
            function size = get.fontSize(obj)
                size = get(obj.Control, 'FontSize');
            end
    
            function set.fontSize(obj, newSize)
                set(obj.Control, 'FontSize', newSize);
            end
    
            function color = get.backgroundColor(obj)
                color = get(obj.Control, 'BackgroundColor');
            end
    
            function set.backgroundColor(obj, newColor)
                set(obj.Control, 'BackgroundColor', newColor);
            end
    
            function color = get.foregroundColor(obj)
                color = get(obj.Control, 'ForegroundColor');
            end
    
            function set.foregroundColor(obj, newColor)
                set(obj.Control, 'ForegroundColor', newColor);
            end
    
            % You can even rename some uicontrol properties to fit your
            % purpose.
            function items = get.items(obj)
                items = get(obj.Control, 'String');
            end
    
            function set.items(obj, newItems)
                set(obj.Control, 'String', newItems);
            end
    
        end
    end
    

    然后,您可以像使用任何其他ComboBox句柄一样使用uicontrol

    obj = ComboBox(figure, 'hello|goodbye');
    set(obj, 'items', 'newItem1|newItem2');
    
  3. 有扩展句柄图形类的未记录方法, 但我不熟悉他们。看看这个参考: http://undocumentedmatlab.com/blog/introduction-to-udd/