如何访问uipanel子女的启用属性?

时间:2014-01-17 21:46:44

标签: matlab properties panel children matlab-guide

假设我有这样的GUI enter image description here
我希望每个面板的所有孩子都先被禁用,然后当我检查面板顶部的单选按钮时,该面板的子项将被启用。
你能告诉我怎么做那样的事情?

1 个答案:

答案 0 :(得分:0)

这里的关键点是get()set()不仅仅是标量,他们对句柄向量非常满意。问题是,如何获取和使用这些载体?这里有几种方法,您可以手动为每个面板创建句柄向量:

function gui_OpeningFcn(hObject, eventdata, handles, varargin)
[...]
handles.panel1controls = [handles.edit1, handles.edit2];
handles.panel2controls = [handles.edit3, handles.checkbox1, handles.edit9];
[...]
guidata(hObject, handles);
end

function radio1_Callback(hObject, eventdata, handles)
if (get(handles.radio1, 'Value') == get(handles.radio1, 'Min'))
    set(handles.panel1controls, 'Enable, 'Off');
else
    set(handles.panel1controls, 'Enable, 'On');
end
end

function radio2Callback(...

或者只是动态地执行此操作 - 这样您就可以保存初始设置,如果稍后添加/删除控件,则不必记住更新它,但是控制效果较差,例如你也禁用了文本标签,这在某些平台上看起来有些垃圾:

function radio1_Callback(hObject, eventdata, handles)
if (get(handles.radio1, 'Value') == get(handles.radio1, 'Min'))
    set(get(handles.panel1, 'Children'), 'Enable, 'Off');
else
    set(get(handles.panel1, 'Children'), 'Enable, 'On');
end
end

function radio2Callback(...

现在,每个单选按钮仍然需要一个回调函数,最终可能会有大量的重复代码。让我们变得聪明,并通过UserData将句柄与按钮本身相关联,允许它们共享一个漂亮整洁的通用回调函数:

function gui_OpeningFcn(hObject, eventdata, handles, varargin)
[...]
set(handles.radio1, 'UserData', [handles.edit1, handles.edit2]);
set(handles.radio2, 'UserData', [handles.edit3, handles.checkbox1, handles.edit9]);
[...]
end

function radio_common_Callback(hObject, eventdata, handles)
if (get(hObject, 'Value') == get(hObject, 'Min'))
    enable = 'Off';
else
    enable = 'On';
end
set(get(hObject, 'UserData'), 'Enable', enable);
end

或'动态'整体面板方法,

function gui_OpeningFcn(hObject, eventdata, handles, varargin)
[...]
set(handles.radio1, 'UserData', handles.panel1);
set(handles.radio2, 'UserData', handles.panel2);
[...]
end

function radio_common_Callback(hObject, eventdata, handles)
if (get(hObject, 'Value') == get(hObject, 'Min'))
    enable = 'Off';
else
    enable = 'On';
end
set(get(get(hObject, 'UserData'), 'Children'), 'Enable', enable);
end

禁用所有内容的最简单方法是在GUIDE中设置它,但是我们无法在OpeningFcn()结束时以编程方式执行此操作。事实上,为什么不一次性使用另一个级别的连接:

set([handles.panel1controls, handles.panel2controls, ...], 'Enable', 'Off');

甚至GUI都不受Matlab规则“试图矢量化所有东西”的豁免......