如何从 wxBoxSizer(wxVERTICAL) 中正确删除所有元素(包括 wxsizers 和 wxwindows)

How to Correctly Remove All elements(including wxsizers and wxwindows) from inside a wxBoxSizer(wxVERTICAL)

您好,我正在尝试从 wxBoxSizer(wxVERTICAL) 中删除所有元素(包括 wxSizers 和 wxWindows)。我使用的层级结构如下图所示。

  1. wxBoxSizer(wxVERTICAL) :这包含所有内容,我想删除此 sizer 中的所有内容。我们称这个 sizer 为 mainSizer。
  2. wxPanel:我们称它为 elementPanel
  3. wxBoxSizer(wxVERTICAL): 这包含了第 4 步中的水平 sizer
  4. wxBoxSizer(wxHORIZONTAL): 这包含 wxStaticText 和水平间隔
  5. wxStaticText 包含我要显示的文本
  6. wxBoxSizer(wxHORIZONTAL): 这是固定宽度的水平间隔。

请注意,在静态文本的上方和下方还有两个垂直分隔符,以使静态文本垂直居中,但我没有在图中显示它们。

我只有一个 mainSizer 和许多垂直放置的此类 elementPanel,因为包含的 mainSizer 是垂直的。现在我想从 mainSizer 中删除所有垂直放置的元素面板(以及其中的所有内容)。我怎样才能做到这一点? wxsizer 是否有关联的 id?如果没有,我如何从程序的另一部分找到这个特定的 mainSizer,以便我可以删除其中的所有内容。也就是说,我想删除我在 mainSizer 中添加的所有元素面板(以及里面的所有内容),但不删除 mainSizer 本身。

我想我可以将 mainSizer 放在 wxPanel 中并使用它的 id 来访问 mainSizer。但问题仍然存在如何从 mainSizer 中删除每个子项(包括 sizer 和 wxWindow)?

据我所知,没有删除或销毁 sizer 的 children 的命令。 来自已弃用函数的文档 wxSizer::Remove(wxWindow* window)

wxSizer::Remove(wxWindow* window); "Removes a child window from the sizer, but does not destroy it (because windows are owned by their parent window, not the sizer)."

因此,要销毁 sizer 的元素,您必须从面板的 parents 调用 DestroyChildren()。您可以专门为此目的制作一个 window 并让它 children 成为您在 box sizer 中想要的元素。

parentWindowInsideBoxSizer->DestroyChildren();

您还可以删除个人 children。

parentWindowInsideBoxSizer->RemoveChild(child)  

https://docs.wxwidgets.org/3.0/classwx_window.html#acee332ed4368d26e8bc3db5767c1240a