【问题标题】:MATLAB callback function: undefined function?MATLAB回调函数:未定义的函数?
【发布时间】:2016-08-18 16:39:43
【问题描述】:

我有一个按钮组,里面有 3 个单选按钮,还有一个显示部分。

我想要的效果是,一旦选择了一个单选按钮,显示部分也会改变。

我使用一个类来实现它,并在创建这些组件时添加SelectionChangedFcn

app.ControlButtonGroup.SelectionChangedFcn = {@controlBtnGroupSelectionChanged, app}

我在保存createComponents.m函数文件的同一个文件中定义了函数controlBtnGroupSelectionChanged(obj, eventData, app)

但是当我点击不同的收音机时,错误信息如下:

用于输入的未定义函数“controlBtnGroupSelectionChanged” “matlab.ui.container.ButtonGroup”类型的参数。出错时 评估 ButtonGroup SelectionChangedFcn

我还将controlBtnGroupSelectionChanged 函数声明为我的类中的私有方法。

controlBtnGroupSelectionChanged 函数如下:

function controlBtnGroupSelectionChanged(obj, eventData, app)
% Update display section as the radio button in control section is changed

    %new = app.ControlButtonGroup.NewValue;
    new = obj.SelectedObject.String;
    switch new
        case 'Transfer Path'
            % display the transfer path
            imagesc(app.curImage,'Parent',app.DisplayPath);
            app.DisplayPath.Visible = 'off';
        case 'Store'
            % display the store text
            text(curStore,'Parent',app.DisplayPath);
        case 'Mill'
            % Display the Mill text
            text(curMill,'Parent',app.DisplayPath);
    end
end

类中定义的部分如下:

methods (Access = private)

    % Create UIFigure and components
    createComponents(app);

    % Callback function for Control Button Group Selection Changed
    controlBtnGroupSelectionChanged(obj, eventData, app);

end

而createComponents函数中与此相关的部分是:

    app.ControlButtonGroup = uibuttongroup(app.UIFigure);
    app.ControlButtonGroup.Title = 'Control';
    app.ControlButtonGroup.FontSize = 16;
    app.ControlButtonGroup.Units = 'Normalized';
    app.ControlButtonGroup.Position = [0.45 0.75 0.45 0.2];
    app.ControlButtonGroup.SelectionChangedFcn = {@controlBtnGroupSelectionChanged,app};

为什么说我的函数未定义?

更新: 我经历了一些其他的演示,并将回调更改为 app.ControlButtonGroup.SelectionChangedFcn = @(h, e)controlBtnGroupSelectionChanged(app)。并定义(也是原型)它就像 controlBtnGroupSelectionChanged(app)。然后就可以了。所以我想问题应该是关于参数的数量,但我仍然没有找到太多的详细信息。任何提示表示赞赏!

【问题讨论】:

  • 你确定你的函数名没有错别字吗?发布实际文件也会对您有所帮助。
  • 是的,我复制了这个名字以防万一我没有打错字。我只是仔细检查了它
  • 我想知道从另一个私有方法调用私有方法是否有问题?
  • 当我在 MATLAB 命令行中键入“which controlBtnGroupSelectionChanged”时,它会显示 C:\Users\mxie\Desktop\AnalyticalEngine(OOP)\@DisplayPanel\controlBtnGroupSelectionChanged.m % DisplayPanel 方法。所以它被定义并且应该被认可。
  • 在下面添加了答案和描述。

标签: matlab oop event-listener


【解决方案1】:

您实际上需要将对象作为函数的第一个参数提供,以便 MATLAB 知道将其作为 app 的方法来查找。

app.ControlButtonGroup.SelectionChangedFcn = @(s,e)controlBtnGroupSelectionChanged(app, s, e);

% Or this way which implicitly passes the two input parameters

app.ControlButtonGroup.SelectionChangedFcn = @app.controlBtnGroupSelectionChanged;

那么你的方法应该是这样的

function controlBtnGroupSelectionChanged(obj, source, event)

如果您不需要source(控制按钮组的句柄)或event(与选择事件关联的事件数据),那么您可以让您的回调“忽略”这些第二个和第三个输入通过做类似的事情

app.ControlButtonGroup.SelectionChangedFcn = @(s,e)app.controlBtnGroupSelectionChanged();

你的方法看起来像

function controlBtnGroupSelectionChanged(app)

【讨论】:

  • 谢谢!那我应该定义什么参数。 controBtnGroupSelection(app),还是什么都没有?
  • @MichelleShieh 这取决于您是否需要前两个参数。我已经更新了一个解释
  • 非常感谢!你完美解决了我的问题!只是想知道为什么我们在调用之前需要 (s,e) ?预先陈述什么?有没有关于它们的概念解释/文档?
  • @MichelleShieh 所有uicontrol 回调自动将两个输入参数传递给回调。 @(s,e) 接受两个回调,但不会将其中任何一个传递给您的函数。更多信息this answer
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
相关资源
最近更新 更多