首页 > 解决方案 > 在 MATLAB 中设置多个复选框的值

问题描述

我有一个带有 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 语句?

标签: matlabmatlab-guide

解决方案


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

和函数可以对句柄向量进行操作,因此您可以将其全部简化为一个函数调用来设置所有内容setget如果您只想设置先前选中的复选框(假设默认情况下未选中其余复选框),您可以将存储的复选框状态用作复选框句柄向量的逻辑索引:

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'属性以使其出现和消失。即使不可见,所有窗口组件(即复选框)仍然存在,并且可以使用存储在handles结构中的句柄访问它们的状态。这避免了在重新打开窗口时将它们的状态存储在全局变量中或设置它们的状态的需要。

避免全局变量

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

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

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

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

推荐阅读