Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ sizer是处理表单的好方法吗?_C++_Wxwidgets_Sizer - Fatal编程技术网

C++ sizer是处理表单的好方法吗?

C++ sizer是处理表单的好方法吗?,c++,wxwidgets,sizer,C++,Wxwidgets,Sizer,我正在将我的一个应用程序从一个旧的GUI(在那里我使用固定大小)移动到wxWidgets(在那里我试图学习sizers的基础) 在应用程序中,我有几个结构非常复杂的表单。数据的性质和工作流程建议我将所有这些数据放在一个屏幕上。 但是这个屏幕必须经过适当的设计才能使用 这是表格的旧版本 。。。下面是我使用测码器大致能想到的 请注意,我不能简单地使用wxGridSizer,因为一些小部件跨越整行,另一些小部件脱离固定网格等等 显然,我可以继续努力使它不那么难看,但我发现自己在想,也许施胶器不是正

我正在将我的一个应用程序从一个旧的GUI(在那里我使用固定大小)移动到wxWidgets(在那里我试图学习sizers的基础)

在应用程序中,我有几个结构非常复杂的表单。数据的性质和工作流程建议我将所有这些数据放在一个屏幕上。 但是这个屏幕必须经过适当的设计才能使用

这是表格的旧版本

。。。下面是我使用测码器大致能想到的

请注意,我不能简单地使用wxGridSizer,因为一些小部件跨越整行,另一些小部件脱离固定网格等等

显然,我可以继续努力使它不那么难看,但我发现自己在想,也许施胶器不是正确的工具。为了实现我想要的,我需要类似于wxGridSizer的东西,带有某种colspan/rowspan机制,也许这还不够

所以我开始考虑自己制作一个“表格尺寸器”,可以像这样

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();
widget1->SetSize(CalculatedX, CalculatedY, 100/f, 20/f);
CalculatedX+=100/f;
widget2->SetSize(CalculatedX, CalculatedY, 500/f, 20/f);
CalculatedX+=0;
CalculatedY+=20/f;
用户将设置每个小部件的相对大小,以完全阻止窗体的几何图形。要使此几何体在调整
Layout()
大小时适合wxPanel,将计算适当的比例因子
f
,然后将所有大小和位置设置为

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();
widget1->SetSize(CalculatedX, CalculatedY, 100/f, 20/f);
CalculatedX+=100/f;
widget2->SetSize(CalculatedX, CalculatedY, 500/f, 20/f);
CalculatedX+=0;
CalculatedY+=20/f;
诸如此类(这只是一个擦伤,简单地说就是一个粗略的想法;应该有一些机制来避免将所有内容都变得太小,以至于无法容纳小部件中的文本和/或相应地缩放字体大小等等)


这似乎合理吗?你会如何面对这个话题?这一选择将对我未来的发展产生相当大的影响,因此任何回答、批评和评论都是非常受欢迎的

wxGridSizer
可能无法满足您的需要,但更灵活的类(如)应该满足您的需要。此类允许您通过在调用
wxGridBagSizer::Add
时设置
wxGBSpan
,将项目设置为跨多个行和列

正如@sjdowling的回答中提到的,您可以使用
wxGridBagSizer
。但是我不建议使用这个类,因为它有一些绝对定位的问题,特别是它使得在它周围移动元素或添加元素非常困难,除非在最后

的确,wxWidgets大小调整器缺乏跨不同大小对齐元素的能力,如果您使用普通的长方体或网格大小调整器,这就是您在这里需要的,这很烦人。但是,您可以通过明确地固定列的大小来解决此问题,或者只需对列进行硬编码(请至少使用对话框单位,而不是像素,以避免布局损坏,尤其是在高DPI的情况下),或者通过迭代所有标签并对所有标签调用
GetTextExtent()
,然后选择最长的标签(这更可靠,特别是当使用可以大幅改变字符串宽度(以像素为单位)的转换时)。然后只需将此宽度指定给您创建的标签:由于初始宽度也是最小宽度,这将确保所有标签都具有此宽度,因此对齐,即使它们处于不同的大小


正如我所写的,如果您在代码中创建布局,这有点烦人,但实际上并没有那么糟糕。如果您在GUI设计器中创建布局,它甚至更难看,但您仍然可以调用
wxSizer::SetItemMinSize()
源于代码。当然,唯一真正的解决方案是添加对内部尺寸调整的支持,但现在这仍然比使用
wxGridBagSizer
IMO更可取。

Super!我有点惭愧,我在浏览和阅读中从未发现这一点,这似乎真的是我的解决方案。给我一点测试,我会接受这个答案。我是facing在执行您的建议时遇到了一些困难,但我不能说是因为工具还是因为我对它缺乏信心。也就是说,我在管理列宽方面有很大的困难:即使内容不同,它们往往都是相同的,我没有“比例”参数来处理它们。
wxSizer::SetItemMinSize()
做了一些工作,但举例来说,我有一个列,除了一个有20X20按钮的列外,它在所有行中都是Colspan。你会期望它的宽度是20px,相反,它与其他列的宽度相同。我继续测试!经过更多测试后,我决定接受你的答案。
wxGridBagSizer
不是完美的,但它似乎是完美的到目前为止,我的需求最好。我不知道,我在实施@sjdowling建议时遇到了一些困难,但我不能说jet是因为工具还是因为我对它缺乏信心。请注意,我不打算使用绝对定位。你的建议很有趣,但看起来我必须创建一个sizer包装(我有大约30张表格,我不想重复这个过程30次)并且对它施加了太多的限制,这让我想知道在这种情况下为什么要使用Sizer-plaese没有把我列入“绝望地想要重新发明轮子的人”列表中:-)