Octave允许创建用户界面。虽然matlab为GUIDE
提供了一个用于图形设计和编辑用户界面的复杂工具,但是octave没有这样的工具。相反,您必须通过在ui窗口坐标系中指定数字坐标来手动放置ui元素。
另一方面,字段中的用户界面有许多布局引擎,例如 qt 甚至 x-windows 和 android 或者在 html 的网络浏览器中。所以问题已经解决了很多次。
我正在寻找一种解决方案,允许用户界面组件的通用放置,例如在表格或网格布局中。
我想像使用像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
功能的其他选项可以控制单元格和其他布局选项中的位置。对于使用现有代码的八度音程实现是否有任何建议?
答案 0 :(得分:4)
我不知道这个'包',但这是一个模拟简单'布局'方法的简短例子。
(为简洁起见省略了通常的健全性检查)。
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
这不完整,我将'subgrids'问题留给您,但实施起来应该不会太难。话虽如此,matlab / octave上没有“抽象框”功能(有hggroups,但这有些不同,我不确定它是否可用于容纳uicontrols),所以subgrids 必须在坐标层面实施。
然而,我觉得有必要挑剔这个问题。首先,提到GUIDE,但我认为这与此无关。除了允许您通过可视网格直观地放置内容之外,这不是布局管理器。至少不是你所暗示的意义上的。 功能
其次,没有布局管理器这样的东西。 Java有大约10亿个不同的布局管理器可供选择(从Flow到Gridded到Boxed到任何东西,包括'Absolute',它基本上像八度音阶)。 Html使用特定的“流”方法,因为它适合于回流文本。 功能
因此,布局管理器只是一组任意规则,处理相对于绝对定位的转换,并可能处理调整大小。 Octave已经有一些内置的,例如在像素与规范化单位之间进行选择,并在每个图形对象中内置调整大小 - 回调功能。我发现只需通过“标准化”单位系统即可完成你想要的任务,并且不需要像Java那样复杂的布局管理器......但是如果你喜欢'网格',那么将前者翻译成后者应该是相对的很容易,就像我上面所示。 功能