【问题标题】:Matlab uibutton callbackMatlab uibutton 回调
【发布时间】:2018-05-25 10:40:04
【问题描述】:

我正在使用 matlab 中的 GUI 并希望将 uibutton 链接到回调函数。现在,我只是保持简单并具有以下内容:

function []=set_time();

    function [] = set_time_callback(app)
        fprintf('\nhello world!')
    end

    app.UIFigure=uifigure;

    app.SetButton = uibutton(app.UIFigure,'push','Position',[23 29 106 22],'ButtonPushedFcn', @(app) set_time_callback(app));

end

它在对我大喊:

使用 set_time 时出错>@(app)set_time_callback(app) 输入参数过多。

使用 matlab.ui.control.internal.controller.ComponentController/executeUserCallback 时出错(第 262 行) 评估按钮 PrivateButtonPushedFcn 时出错

有什么建议吗?

【问题讨论】:

    标签: matlab user-interface callback uibutton


    【解决方案1】:
    function set_time()
    
        function set_time_callback(app)
            fprintf('\nhello world!')
        end
    
        app.UIFigure = uifigure();
        app.SetButton = uibutton(app.UIFigure,'push','Position',[23 29 106 22],'ButtonPushedFcn',@(obj,evt) set_time_callback(app));
    
    end
    

    您订阅的事件处理程序(回调)必须遵守预定义的签名,该签名必须定义所有输入参数(第一个是sender object,第二个代表event data)。

    有关回调的更多信息,请阅读this

    【讨论】:

      【解决方案2】:

      回调函数需要至少 2 个输入 - 对象和事件。您收到错误消息是因为您只提供了一个输入变量 app 并且您正在使用它。当回调函数被调用时,Matlab 传递了 2 个额外的输入变量,所以你的函数需要有 3 个输入变量。我会尝试将您的功能更改为类似的功能

      function []=set_time();
      
          function [] = set_time_callback(obj, evt ,app)
              fprintf('\nhello world!')
          end
      
          app.UIFigure=uifigure;
      
          app.SetButton = uibutton(app.UIFigure,'push','Position',[23 29 106 22],'ButtonPushedFcn', @(obj, event) set_time_callback(obj, event, app));
      
      end
      

      将对象传递给函数的另一种方法是

      app.SetButton = uibutton(app.UIFigure,'push','Position',[23 29 106 22],'ButtonPushedFcn', {@set_time_callback, app});
      

      现在在函数 set_time_callback 中,您没有使用您试图传递的变量 app。除非您计划添加一些功能,否则您可以摆脱此变量。其他两个变量也没有使用。您可以在函数声明中使用~ 符号代替这些变量,但您仍然需要为 2 个变量保留空间。

      function []=set_time();
      
          function [] = set_time_callback(~, ~)
              fprintf('\nhello world!')
          end
      
          app.UIFigure=uifigure;
      
          app.SetButton = uibutton(app.UIFigure,'push','Position',[23 29 106 22],'ButtonPushedFcn', @set_time_callback);
      
      end
      

      使用函数句柄你可以在你的回调函数声明中去掉这两个变量

      function []=set_time();
      
          function [] = set_time_callback()
             fprintf('\nhello world!')
          end
      
          app.UIFigure=uifigure;
      
          app.SetButton = uibutton(app.UIFigure,'push','Position',[23 29 106 22],'ButtonPushedFcn', @(obj, event) set_time_callback());
      
      end
      

      在这种情况下,如果您仍想在函数内部传递变量,请使用 this

      function []=set_time();
      
          function [] = set_time_callback(varName)
             fprintf('\nhello world!')
          end
      
          app.UIFigure=uifigure;
      
          app.SetButton = uibutton(app.UIFigure,'push','Position',[23 29 106 22],'ButtonPushedFcn', @(obj, event) set_time_callback(app));
      
      end
      

      【讨论】:

      • 很棒的细节。太感谢了!这解决了问题。
      • 对我来说关键是按钮回调函数必须在定义 ui 的函数中定义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多