如何手动将Matlab GUIDE GUI代码转换为Octave UI组件

时间:2017-11-15 02:42:44

标签: matlab user-interface octave

我应该如何转换(手动)由Matlab GUIDE GUI创建的代码,以使用Octave的UI组件?

这样的东西:

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
               'gui_Singleton',  gui_Singleton, ...
               'gui_OpeningFcn', @Mat_to_Octave_OpeningFcn, ...
               'gui_OutputFcn',  @Mat_to_Octave_OutputFcn, ...
               'gui_LayoutFcn',  [] , ...
               'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

等。等。

  1. 我在哪里可以找到需要替换的完整元素列表?

  2. 如何为Octave UI elements创建GUIDE回调函数的等效函数,是否可以为所有元素创建单个回调函数?也许这两者之间存在差异。

  3. GUID GUI代码是打开还是开源?它surely seems so here

  4. 用户在GUIDE中设置的UI布局是否可访问?即我们知道按钮的宽度和文本颜色设置保存在哪里吗?

  5. 某处有完整的清单吗?如果是的话,在哪里? UI组件中是否提供了GUIDE中的所有元素或至少大部分元素?我怎么检查这个?

  6. 在开始任务之前有什么遗漏的吗?

1 个答案:

答案 0 :(得分:2)

在大多数情况下,八度音阶上的GUI创建与matlab相同。 GUI创建是八度音阶的一个相对较新的补充,所以期望matlab系列中的几个最近的添加尚未使它成为八度音阶,但是在大多数情况下,实现GUI应用程序的matlab代码应该在八度音程上工作没有或很少需要调整。以下是matlaboctave的相应手册条目;你会注意到核心功能是相同的。

一个重要的' catch'是八度音程暂时不支持嵌套函数的句柄(这可能会在以后更改)。例如,考虑以下matlab代码实现一个带有影响绘图的滑块的简单GUI(取自this answer)。

%%%%%% In file myplot.m %%%%%
function myplot

  %% Create initial figure and spiral plot
  figure;  axes ('position', [0.1, 0.3, 0.8, 0.6]);
  t = linspace (0, 8*pi, 100);  x = t .* cos(t);  y = t .* sin(t);
  plot (x, y);  axis ([-100, 100, -100, 100]);

  %% Add ui 'slider' element      
  hslider = uicontrol (                    ...
         'style', 'slider',                ...
         'Units', 'normalized',            ...
         'position', [0.1, 0.1, 0.8, 0.1], ...
         'min', 1,                         ...
         'max', 50,                        ...
         'value', 10,                      ...
         'callback', {@plotstuff}          ...
       );

  %% Callback function called by slider event
  function plotstuff (h, event)
    n = get (h, 'value');
    x = n * t .* cos(t);  y = n * t .* sin(t);
    plot (x, y);  axis ([-100, 100, -100, 100]);
  end
end

如果您尝试在八度音程上运行此命令,则会收到以下错误消息:

  

>> myplot
  错误:尚不支持嵌套函数的句柄
  错误:来自       myplot在第10行第11列

将嵌套函数转换为独立函数或子函数可解决此问题(如this answer中所示)。

至于GUIDE,虽然八度音阶没有类似的用户友好"用于创建GUI应用程序的图形工具,在一天结束时,所有GUIDE都会为UI元素创建生成适当的底层代码,理论上应该与八度音程兼容。话虽如此,但值得一读的是GUIDE创建的文件,即' .fig'文件加载数字元素,以及'功能'文件包含回调和实际代码等。所以,"运行"以八度为单位的GUIDE生成文件可能涉及“加载”#39;这个数字首先。此外,在实践中,GUIDE可能会使用嵌套函数进行回调,因此代码可能需要进行一些调整才能将这些函数转换为合适的子函数,以使其在八度音程上工作。

话虽如此,GUIDE确实更适合那些喜欢避免“实际”的人。代码,但实际上,一旦熟悉get / set命令如何操作ui-element属性,直接在matlab / octave中编写GUI可能会更加简单明了。如果您在使用适用于octave和matlab的GUI解决方案之后,我肯定会建议沿着这条路线前进,并坚持使用子功能而不是嵌套功能。

回答上述未涵盖的其余两个问题:

  • 不,GUIDE不是开源的(更不用说免费软件了)。它是Mathworks的专有代码,使用其许可证。特别是,从理论上讲,使用带有八度音程的GUIDE生成的代码可能存在许可问题,但我不确定。

  • GUIDE直接生成.fig文件。这是一个二进制文件,可以加载到matlab(理论上是八度)。使用GUIDE,没有其他来源'文件详细说明了用于创建此图的元素及其属性。话虽如此,在matlab中,一旦加载了数字,就可以导出源代码'从图形的图形菜单中,如果需要,可以重新创建该图形。但是,这可能不是最适合人性化的代码。这是优于程序化方法优于GUIDE的原因之一:您拥有干净,清晰的源代码,它以编程方式详细说明了uielements的属性,而不是通过加载图形并搜索其属性来完成它们。