问题描述
嗨,我正在尝试从 wxBoxSizer(wxVERTICAL) 中删除所有元素(包括 wxSizer 和 wxWindows)。我使用的层次结构如下面的屏幕截图所示。
- wxBoxSizer(wxVERTICAL) :这包含所有内容,我想删除此 sizer 中的所有内容。我们称这个 sizer 为 mainSizer。
- wxPanel:我们称这个 elementPanel
- wxBoxSizer(wxVERTICAL):这包含第 4 步中的水平 sizer
- wxBoxSizer(wxHORIZONTAL):这包含 wxStaticText 和水平间隔
- wxStaticText 保存我想要显示的文本
- wxBoxSizer(wxHORIZONTAL):这是固定宽度的水平间隔。
请注意,静态文本上方和下方放置了两个垂直间隔,以使静态文本垂直居中,但我没有在图中显示它们。
我正好有一个 mainSizer 和许多这样的 elementPanel 垂直放置,因为包含的 mainSizer 是垂直的。现在我想从 mainSizer 中删除所有垂直放置的 elementPanels(以及其中的所有内容)。我怎样才能做到这一点? wxsizer 是否有关联的 id?如果没有,我如何从程序的另一部分找到这个特定的 mainSizer,以便我可以删除其中的所有内容。也就是说,我想删除我在 mainSizer 中添加的所有 elementPanels(以及里面的所有内容),但不要删除 mainSizer 本身。
我想我可以将 mainSizer 放在 wxPanel 中并使用它的 id 来访问 mainSizer。但问题仍然存在,如何从 mainSizer 中删除每个子项(包括 sizer 和 wxWindow)?
解决方法
据我所知,没有删除或销毁 sizer 子项的命令。 来自已弃用函数 wxSizer::Remove(wxWindow* window)
的文档wxSizer::Remove(wxWindow* window); “从 sizer 中删除子窗口,但不销毁它(因为窗口归其父窗口所有,而不是 sizer)。”
因此,要销毁 sizer 的元素,您必须从面板的父级调用 DestroyChildren()。您可以专门为此目的制作一个窗口,并将其子项作为您想要的框尺寸器中的元素。
parentWindowInsideBoxSizer->DestroyChildren();
您也可以删除单个子项。
parentWindowInsideBoxSizer->RemoveChild(child)
https://docs.wxwidgets.org/3.0/classwx_window.html#acee332ed4368d26e8bc3db5767c1240a