我想定制一些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
答案 0 :(得分:0)
没有记录方法(从R2013a开始)将子类写入MATLAB Handle Graphics 类。事实上,由于MATLAB存储hg对象的方式,我们甚至无法得到 一个hg对象的类很容易。例如:
>> fig = figure();
>> class(f)
ans =
double
>> isa(f, 'figure')
ans =
0
>> ishghandle(f)
ans =
1
对此的一个解决方案是编写一个子类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');
有扩展句柄图形类的未记录方法, 但我不熟悉他们。看看这个参考: http://undocumentedmatlab.com/blog/introduction-to-udd/