我正在将我的应用程序从旧的GUI(我使用固定大小)移动到wxWidgets(我正在尝试学习sizer的基础)。
在应用程序内部,我有几种形式相当复杂的形式。数据和工作流程的性质表明我将所有这些数据保存在一个屏幕中。 但是这个屏幕必须正确设计才能使用。
这是表格的旧版本......
......这里或多或少是我用sizer来提出的......
请注意,我不能简单地使用wxGridSizer,因为有些小部件遍布整个行,其他一些小部件则从固定网格等出来。
显然我可以继续努力使它不那么难看,但我发现自己认为也许sizer不是正确的工具。为了实现我想要的东西,我需要类似于wxGridSizer的东西,使用某种colspan / rowspan机制,也许这样就不够了。
所以我开始考虑建立一个" Form Sizer"我本人可能会像
那样int w,h;
GetClientSize(&w,&h);
MyFormSizer *formSizer(w,h);
formSizer->SetDimension( widget1, 100, 20 );
formSizer->SetDimension( widget2, 500, 20 );
formSizer->newRow();
formSizer->SetDimension( widget3, 100, 20 );
formSizer->SetDimension( widget4, 250, 20 );
formSizer->SetDimension( widget5, 250, 20 );
formSizer->Layout();
用户可以设置每个小部件的相对大小,以完全阻止表单的几何形状。要在调整Layout()
大小时计算适当的缩放系数f
,然后将所有大小和位置设置为
widget1->SetSize(CalculatedX, CalculatedY, 100/f, 20/f);
CalculatedX+=100/f;
widget2->SetSize(CalculatedX, CalculatedY, 500/f, 20/f);
CalculatedX+=0;
CalculatedY+=20/f;
等等(这只是一个划痕,把它当作粗略的想法;应该有一些机制来避免使一切都太小而不适合小部件中的文本和/或相应地缩放字体大小和这样的东西)
看起来合理吗?你会如何面对这个话题?这个选择将影响我未来的发展,所以任何答案,批评和评论都会受到欢迎
答案 0 :(得分:1)
wxGridSizer
可能无法满足您的需求,但更灵活的课程(例如wxGridBagSizer
)应该可以满足您的需求。通过在调用wxGBSpan
时设置wxGridBagSizer::Add
,此类允许您设置项目以跨越多个行和列。
答案 1 :(得分:1)
如@ sjdowling的回答所述,您可以使用wxGridBagSizer
。但是我不推荐使用这个类,因为它遇到了绝对定位的一些问题,特别是它使得在它周围移动元素或者除了最后一点之外添加元素非常困难。
wxWidgets sizer确实缺乏对不同大小的元素进行对齐的能力,如果您使用普通的盒子或网格大小调整器,这就是您需要的,这很烦人。但是你可以通过明确地修改列的大小来解决它,或者通过硬编码它们(请至少使用对话单元而不是像素,以避免破坏布局,特别是在高DPI情况下),或者通过遍历所有标签并在所有标签上调用GetTextExtent()
并选择最长的标签(这更加可靠,尤其是在使用能够以像素大幅度改变字符串宽度的翻译时)。然后只需将此宽度指定给您创建的标签:由于初始宽度也是最小宽度,这将确保所有宽度都具有此宽度,因此即使它们位于不同的大小调整器中也是如此。
正如我写的那样,这有点令人讨厌,但如果你在代码中创建布局,那真的不是那么糟糕。如果你在GUI设计器中执行它,它甚至更加丑陋,但你仍然可以从代码中调用wxSizer::SetItemMinSize()
。当然,唯一真正的解决方案是添加对inter-sizer对齐的支持,但是现在这仍然比使用wxGridBagSizer
IMO更好。