【问题标题】:Set values of multiple checkboxes in MATLAB在 MATLAB 中设置多个复选框的值
【发布时间】:2019-03-20 15:49:44
【问题描述】:

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

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

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 语句?

【问题讨论】:

  • 图中是否包含14个复选框?如果是这样,GUIDE 没有任何帮助解决问题,因此您最好了解如何使用代码将复选框添加到图形,然后应该更清楚如何在 14 阶段循环中执行此操作。跨度>

标签: matlab matlab-guide


【解决方案1】:

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

setget 函数可以对句柄向量进行操作,因此您可以将其全部简化为一个函数调用来设置所有内容。如果您只想设置之前选中的复选框(假设其余复选框默认未选中),您可以将存储的复选框状态作为 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(:)));

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


替代品

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

窗口可见性

您可以简单地创建一次,然后调整其'Visibility' property 以使其出现和消失,而不是使用复选框重复打开和关闭窗口。即使不可见,所有窗口组件(即复选框)仍然存在,并且可以使用存储在 handles 结构中的句柄访问它们的状态。这避免了将它们的状态存储在全局变量中或在重新打开窗口时设置它们的状态的需要。

避免全局变量

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    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 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多