【问题标题】:matlab gui radio buttonsmatlab gui单选按钮
【发布时间】:2012-05-29 04:10:08
【问题描述】:

我正在尝试@Amro 的建议,我更改了部分代码,但出现了一些错误:/

请帮帮我。

我将选项设置为:

options = {
    {'r','g','b','c','m','y','k'} ;
    {'x','o','.','s'} ;
    {'1','2','3'} ;
    {'2','3'} ;
    {'1','3'} ;
    {'1','2'}
};

现在,我用matlab写了:

mainGUI(options)

我得到了这些错误:

??? Index exceeds matrix dimensions.

Error in ==> tmp>secondaryGUI at 67
        if strcmp(selected{i},options{i}{j})

Error in ==> tmp>callback at 17
    hOptsGUI = secondaryGUI(hFig);

??? Error while evaluating uicontrol Callback

这是代码:

function  mainGUI(options)
    %# current options
    opts = {'r', '.', '1'};

    %# create main figure, with plot and options button
    hFig = figure;
    callback

    %# options button callback function
    function callback(o,e)
        %# save current options (sharing data between the two GUIs)
        setappdata(hFig, 'opts',opts);

        %# display options dialog and wait for it
        hOptsGUI = secondaryGUI(hFig, options);
        waitfor(hOptsGUI);

        %# get new options, and update plot accordingly
        opts = getappdata(hFig, 'opts');
        opts
    end
end

function hFig = secondaryGUI(hParentFig, options)
    %# create figure
    hFig = figure('Menubar','none', 'Resize','off', ...
    'WindowStyle','modal', 'Position',[100 100 350 200]);
    movegui(hFig, 'center');

    %# all possible plot options

    options = cellfun(@(c) c(end:-1:1), options, 'Uniform',false);
    num = length(options);

    %# get saved settings
    selected = getappdata(hParentFig, 'opts');

    %# top/bottom panels
    hPanBot = uipanel('Parent',hFig, 'BorderType','none', ...
    'Units','normalized', 'Position',[0 0.0 1 0.2]);
    hPanTop = uipanel('Parent',hFig, 'BorderType','none', ...
    'Units','normalized', 'Position',[0 0.2 1 0.8]);

    %# buttongroups in top panel
    hBtnGrp = zeros(1,num);
    width = 1/num;
    for i=1:num
        %# create button group
        hBtnGrp(i) = uibuttongroup('Parent',hPanTop, ...
            'Units','normalized', 'Position',[(i-1)*width 0 width 1]);
        %# populate it with radio buttons
        height = 1./numel(options{i});
        for j=1:numel(options{i})
            h = uicontrol('Parent',hBtnGrp(i), 'Style','Radio', ...
            'Units','normalized', 'Position',[0.05 (j-1)*height 0.9 height], ...
            'String',options{i}{j});
            %# set initially selected values
            if strcmp(selected{i},options{i}{j})
                set(hBtnGrp(i), 'SelectedObject',h)
            end
        end
    end

    %# save button in bottom panel
    uicontrol('Parent',hPanBot, 'Style','pushbutton', ...
        'Units','normalized', 'Position',[0.3 0.2 0.4 0.6], ...
        'String','start', 'Callback',@callback)

    %# save button callback function
    function callback(o,e)
        %# get selected values
        hObjs = get(hBtnGrp(:), 'SelectedObject');
        vals = get(cell2mat(hObjs),{'String'});

        %# update settings
        setappdata(hParentFig, 'opts',vals);

        %# close options dialog
        close(hFig)
    end
end

可能变量“opts”有问题,因为没有以下值:{'r', '.', '1'}?

因为我不知道为什么它超过了矩阵维度,所以选项的长度是 6。

谢谢!

【问题讨论】:

    标签: matlab user-interface radio-button


    【解决方案1】:

    如果我理解正确,您正在设计一个 GUI,使用户能够设置一些参数并返回选定的选项。

    您可以使用GETAPPDATA/SETAPPDATA 作为数据共享机制,而不是像现在这样立即返回值。

    对于布局,使用panels 将组件组合在一起,这样可以提供更灵活的GUI。

    这是一个示例应用程序来说明。我们的想法是我们有一个包含情节的主要人物,我们提供了第二个“对话框”来自定义情节选项。

    function mainGUI()
        %# current options
        opts = {'r', '.', '1'};
    
        %# create main figure, with plot and options button
        hFig = figure;
        hLine = plot(cumsum(rand(100,1)-0.5), ...
            'Color',opts{1}, 'Marker',opts{2}, 'LineWidth',str2double(opts{3}));
        uicontrol('Style','pushbutton', 'String','Options...', 'Callback',@callback)
    
        %# options button callback function
        function callback(o,e)
            %# save current options (sharing data between the two GUIs)
            setappdata(hFig, 'opts',opts);
    
            %# display options dialog and wait for it
            hOptsGUI = secondaryGUI(hFig);
            waitfor(hOptsGUI);
    
            %# get new options, and update plot accordingly
            opts = getappdata(hFig, 'opts');
            set(hLine, 'Color',opts{1}, 'Marker',opts{2}, 'LineWidth',str2double(opts{3}))
        end
    end
    
    function hFig = secondaryGUI(hParentFig)
        %# create figure
        hFig = figure('Menubar','none', 'Resize','off', ...
            'WindowStyle','modal', 'Position',[100 100 350 200]);
        movegui(hFig, 'center');
    
        %# all possible plot options
        options = {
            {'r','g','b','c','m','y','k'} ;    %# color
            {'x','o','.','s'} ;                %# shape
            {'1','2','3'}                      %# width
        };
        options = cellfun(@(c) c(end:-1:1), options, 'Uniform',false);
        num = length(options);
    
        %# get saved settings
        selected = getappdata(hParentFig, 'opts');
    
        %# top/bottom panels
        hPanBot = uipanel('Parent',hFig, 'BorderType','none', ...
            'Units','normalized', 'Position',[0 0.0 1 0.2]);
        hPanTop = uipanel('Parent',hFig, 'BorderType','none', ...
            'Units','normalized', 'Position',[0 0.2 1 0.8]);
    
        %# buttongroups in top panel
        hBtnGrp = zeros(1,num);
        width = 1/num;
        for i=1:num
            %# create button group
            hBtnGrp(i) = uibuttongroup('Parent',hPanTop, ...
                'Units','normalized', 'Position',[(i-1)*width 0 width 1]);
            %# populate it with radio buttons
            height = 1./numel(options{i});
            for j=1:numel(options{i})
                h = uicontrol('Parent',hBtnGrp(i), 'Style','Radio', ...
                    'Units','normalized', 'Position',[0.05 (j-1)*height 0.9 height], ...
                    'String',options{i}{j});
                %# set initially selected values
                if strcmp(selected{i},options{i}{j})
                    set(hBtnGrp(i), 'SelectedObject',h)
                end
            end
        end
    
        %# save button in bottom panel
        uicontrol('Parent',hPanBot, 'Style','pushbutton', ...
            'Units','normalized', 'Position',[0.3 0.2 0.4 0.6], ...
            'String','Save & Close', 'Callback',@callback)
    
        %# save button callback function
        function callback(o,e)
            %# get selected values
            hObjs = get(hBtnGrp(:), 'SelectedObject');
            vals = get(cell2mat(hObjs),{'String'});
    
            %# update settings
            setappdata(hParentFig, 'opts',vals);
    
            %# close options dialog
            close(hFig)
        end
    end
    

    【讨论】:

    • 您好,非常感谢您的评论,但这并不是我所需要的:/ 我又试着问了一遍,所以请您再看一下我的问题吗? stackoverflow.com/questions/10775243/matlab-gui-buttons
    • @AlonShmiel:另一个问题几乎相同,我仍然不明白你想要做什么(总是ask具体问题)......我试图解决所有问题你提到的。因此,如果不出意外,请研究上面的代码,也许您会对解决方案有所了解。我确保对每一步都发表评论,所以应该很容易理解。
    • 嗨,我尝试了你的建议。我只需要“图 2”窗口,所以我删除了“图 1”窗口。我改变了我的新问题。如果可以,请帮助我。非常感谢,阿隆。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多