【问题标题】:Is there a simple octave/matlab toolkit for user interface creation with generic layout?是否有用于创建具有通用布局的用户界面的简单 octave/matlab 工具包?
【发布时间】:2017-11-07 16:10:28
【问题描述】:

最先进的

Octave 允许创建用户界面。虽然 matlab 提供了GUIDE 一个用于图形设计和编辑用户界面的复杂工具,但 octave 没有这样的工具。相反,您必须通过在 ui 窗口坐标系中指定数字坐标来手动放置 ui 元素。

另一方面,在 qt 甚至 x-windowsandroid 中也有许多用于用户界面的布局引擎或在 html 的 Web 浏览器中。所以这个问题已经解决了很多次了。

请求的解决方案

我正在寻找一种解决方案,它允许用户界面组件的通用放置,例如在表格或网格布局中。

我想象使用像 html 表格这样的布局引擎。您定义一个表格,在其中每个单元格放置一个 ui 元素。为了获得一定的灵活性,您可以创建跨多列或多行的组合单元格。

每个单元格应自动调整大小以至少适合内部元素并均匀分布元素。布局选项允许在单元格内定位 ui 元素。

当然应该可以通过在表格单元格中放置一个新表格来创建嵌套结构。

伪代码

这里有一些伪代码来定义 ui 的样子。

ui = cell(2,2);
addUIElement(ui, 1,1, uicontrol("style", "text", "string", "This is text"));
addUIElement(ui, 1,2, uicontrol("style", "text", "string", "This is another text"));
addUIElement(ui, 2,1, uicontrol ("style", "pushbutton", "string", "Push me");
addUIElement(ui, 2,2, uicontrol ("style", "pushbutton", "string", "Push me too");
% Create and draw the user interface
gui = CreatGui(ui); 

注意事项

  • 面向对象的实现可能比功能接口更合适
  • addUIElement 函数的其他选项可以控制单元格中的位置和其他布局选项。

问题

对于使用现有代码在 octave 中实现有什么建议吗?

【问题讨论】:

  • 坐标可以“标准化”(即百分比单位)。您可以简单地将所需网格的坐标定义为元胞数组,然后将它们直接插入您的 uicontrol 函数的 position 参数中。确实不需要更精细的“网格化”界面。
  • 这读起来(有许多要求)就像学校/大学的作业。如果您考虑 Tasos 的评论,那么实现这一点应该不难。考虑将其推送到 github/bitbucket/wahtever 并在完成后在此处添加链接
  • @Tasos:只要你不打算改变你的设计,标准化的单位就很好。用户界面的设计更改可能由设计人员决定,或者——更有趣的是——在通用用户界面中发生。示例:为多个选项制作一组按钮以适应可用选项。无论如何,您必须更正设计中的所有坐标。这可以通过布局引擎自动化。也许我必须在问题中更详细地解释这一点。
  • @Andy:谢谢你的提示。也许我的问题对于这个平台来说有点太“大”了。事实上,这可能是一个不错的大学项目。但我知道这种类型的布局引擎有可用的解决方案,例如在 X-Windows 或 qt 中。我希望在这里找到一个八度适应性解决方案的提示。我应该将此添加到问题中。

标签: matlab octave


【解决方案1】:

我不知道为此有一个“包”,但这里有一个模拟简单“布局”方法的简短示例。
(为简洁起见,省略了通常的健全性检查)。 p>

function guitesto
  ui      = cell(2,2);
  layout  = defineLayout (size (ui));  

  ui{1,1} = uicontrol ("style", "text", "string", "This is text");
  ui{1,2} = uicontrol ("style", "text", "string", "This is another text");
  ui{2,1} = uicontrol ("style", "pushbutton", "string", "Push me");
  ui{2,2} = uicontrol ("style", "pushbutton", "string", "Push me too");

  applyLayout (ui, layout)
end

function Out = defineLayout (Gridsize)
  VGridCoords = linspace (0, 1, Gridsize(1) + 1);
  HGridCoords = linspace (0, 1, Gridsize(2) + 1);
  Out = cell();
  for Row = 1 : Gridsize(1), for Col = 1 : Gridsize(2)
    Out{Row, Col} = [HGridCoords(Col), ...
                     1 - VGridCoords(Row+1), ...
                     HGridCoords(Col+1) - HGridCoords(Col), ...
                     VGridCoords(Row+1) - VGridCoords(Row)];
  end, end
end

function applyLayout (ui, layout)
  for Row = 1 : size (ui, 1), for Col = 1: size (ui, 2)
    set (ui{Row, Col}, 'units'   , 'normalized', ...
                       'position', layout{Row, Col});
  end, end
end

它不完整,我将“子网格”问题留给您,但实施起来应该不会太难。话虽如此,matlab / octave 上没有“抽象框”功能(有 hggroups,但那是不同的,我不确定它是否可以用来容纳 uicontrols),所以子网格 必须在坐标级别实现。


然而,我觉得有必要在这个问题上挑剔。首先,提到了GUIDE,但我觉得这里无关紧要。除了允许您通过可视网格直观地放置事物之外,这不是布局管理器。至少在你暗示的意义上不是。

其次,没有布局管理器之类的东西。 Java 有大约 10 亿种不同的布局管理器可供选择(从 Flow 到 Gridded 到 Boxed 等等,包括基本上类似于 octave 的“Absolute”)。 Html 使用特定的“流”方法,因为它适合重排文本。

所以布局管理器只是一组任意规则,处理相对于绝对定位的转换,并可能处理调整大小。 Octave 已经内置了一些功能,例如在像素单位与标准化单位之间进行选择,以及每个图形对象中内置的调整大小回调功能。我发现人们可以通过“规范化”单位系统非常简单地做你想做的事情,并且不需要像 Java 这样的复杂布局管理器......但是如果你喜欢“网格”,那么将前者翻译成后者应该是相对的就像我上面展示的那样简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2018-02-06
    相关资源
    最近更新 更多