在 MATLAB 中设置多个复选框的值

Set values of multiple checkboxes in MATLAB

我有一个带有 14 个复选框的弹出窗口 window(我在我的 GUI 中单击一个按钮,另一个带有复选框的 window 打开,我检查我需要的那些然后我关闭它)并且我如果已经检查过,想设置它们的值。

我为我的复选框的值使用了 14 个全局变量,我使用这个解决方案来设置它们的值(这样,当我重新打开 window 我看到哪个复选框被选中)

function figure_checkboxes_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);

global checkbox1
global checkbox2 %...to 14

if checkbox1 == 1
    set(handles.checkbox1,'Value',1);
end
if checkbox2 == 1
    set(handles.checkbox2,'Value',1);
end
% 14 if statement for each checkbox

显然,当我定义 global checkbox1 时,是因为我有一个按钮可以获取每个复选框的值(即 checkbox1 = get(handles.checkbox1,'Value');

有没有更聪明、更紧凑的方法来避免十四个 if 语句?

这是可以通过多种不同方式解决的问题之一。首先,我将为您提供最直接地回答您的问题的解决方案,同时对现有代码进行最少的修改...

set and get functions can operate on vectors of handles, so you can reduce it all to just one function call to set everything. If you only want to set the checkboxes that were previously checked (assuming that the remaining are unchecked by default) you can use your stored checkbox states as a logical index 放入复选框句柄的矢量中:

cbHandles = [handles.checkbox1 handles.checkbox2 ... handles.checkbox14];  % All handles
cbStates = [checkbox1 checkbox2 ... checkbox14];  % All states
set(cbHandles(logical(cbStates)), 'Value', 1);

或者,您可以按如下方式设置所有状态(选中或未选中):

set(cbHandles, {'Value'}, num2cell(cbStates(:)));

如您所见,如果您将复选框句柄和状态存储为向量而不是多个变量,这将变得更容易。


备选方案

这里有一些解决或改进此问题的替代方法,这将需要对现有代码进行更多修改:

Window 可见度

无需使用复选框反复打开和关闭 window,您只需创建一次,然后调整其 'Visibility' property 使其出现和消失。即使不可见,所有 window 组件(即复选框)仍然存在,并且可以使用存储在 handles 结构中的句柄访问它们的状态。这避免了在重新打开 window.

时将它们的状态存储在全局变量中或设置它们的状态的需要

避免全局变量

handles 结构,与其名称相反(因为它可以随意命名)只是一个常规的 structure,可以存储任何数据,而不仅仅是图形句柄。在你的关闭函数中(或者你在关闭前存储复选框状态的任何地方),你可以将状态添加到 handles 结构:

handles.cbStates = get(handles.cbHandles, 'Value');
guidata(hObject, handles);

这假设您的复选框句柄存储在向量中 cbHandles。然后,您将更新打开函数中的状态,如下所示:

set(handles.cbHandles, {'Value'}, handles.cbStates);

请注意,我不鼓励使用全局变量。但是,如果没有您的代码的更多细节,我将使用您提供的代码...

您可以使用单个结构变量,将所有复选框值存储在其中并循环更新:

function figure_checkboxes_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);

global checkboxValues % Struct with fields 'checkbox1', 'checkbox2', ...

% Loop using dynamic struct field name notation struct.('field')
for icb = 1:14
    cbName = sprintf( 'checkbox%.0f', icb );
    if checkboxValues.(cbName) == 1
        set( handles.(cbName), 'Value', 1 );
    end
end

对于基本相同的操作,您可以使用 arrayfun 使它看起来更加精简。用这个替换循环:

str = @(icb) sprintf('checkbox%.0f',icb);
arrayfun( @(icb) set( handles.(str(icb)), 'Value', checkboxValues.(str(icb)) ), 1:14 );