隐藏小部件后,一些空白 space 保留在 QVBoxLayout 中(Qt)

some blank space remains in QVBoxLayout after hiding widgets (Qt)

QVBoxLayout 中有数百个小部件。根据选项菜单,我是 hiding/showing 他们。如果我隐藏了一些小部件,一些空白 space 会留在 QVBoxLayout 中,我不想要这个不必要的 space。在底部添加 spacer 并不能解决问题。设置边距间距相同。它就像隐藏的小部件一样消耗一些 space。有没有什么办法解决这一问题? 谢谢

布局在每个子部件之间有一些默认间距,由 setSpacing()setHorizontalSpacing()setVerticalSpacing() 定义。即使您隐藏了子部件,它周围的间距仍然可见。 (注意:我认为这是 Qt 开发人员做出的错误设计决定,但我们需要接受它。)您基本上有这些选择:

a) 从布局中移除子控件而不是隐藏它。记住它的原始位置,如果它应该再次显示,将它插入到那个位置。这很复杂,如果你删除了一些其他小部件,原始位置可能会失效,所以这需要一些聪明的算法来保持布局中隐藏的子小部件的正确视觉位置等。我不会这样做,感觉太复杂了对我来说。

b) 在布局中使用zero-sized默认间距并通过https://doc.qt.io/qt-5/qboxlayout.html#addSpacing手动添加间距,然后在隐藏子控件时,将其旁边的QSpacerItem的大小设置为零。并在再次显示子窗口小部件时将其设置回 non-zero。

c) a) 的替代方案,但不保留原始索引,但有一个指向子小部件的指针容器,当需要更改子小部件的可见性时,然后从布局中删除所有项目并放置所有应该对布局可见的子部件。这意味着要re-create 布局中的内容每次更改。实际上,这就是我在代码中的做法。我有大约 20 个小部件,hiding/showing 已经足够快了。我相信即使有数百个小部件,它也足够快。

d) 和 c) 的替代方案 ... 如果您有大量的小部件,那么您应该考虑删除那些不应该显示的小部件,并在显示时 re-creating 删除它们。 IE。在 c) 中,我们让小部件保持活动状态,但隐藏在某个容器中,但在 d) 中,我们删除了这个小部件,稍后再创建它。这取决于您的用例,c) 是否优于 d),反之亦然。我的直觉是 c) 应该没问题 performance-wise 并且更简单。

注意:我的推理是基于在网格布局中显示和隐藏小部件,但我想 VBox 布局具有相同的原则,即使在隐藏项周围也保留默认间距。