假设我有这样的GUI
我希望每个面板的所有孩子都先被禁用,然后当我检查面板顶部的单选按钮时,该面板的子项将被启用。
你能告诉我怎么做那样的事情?
答案 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规则“试图矢量化所有东西”的豁免......