【发布时间】:2021-01-29 23:06:22
【问题描述】:
我正在实现一个容器,该容器将其子元素连续排列,并在没有水平空间时进行换行。因此,所需的高度取决于可用的宽度。对于更大的宽度,更多的内容适合一行并且需要更少的行,从而导致更少的高度。对于较小的宽度,一行中的内容较少,需要较高的高度。
我对容器进行了子类化并实现了所需的逻辑。容器的最小宽度设置为最宽子项的最小宽度,这将显示一种极端情况,其中有堆叠线,其中一些只有一个子项。
问题如下:显示容器的窗口高度很大,有些情况甚至比我的显示器还大。除了不能减小宽度外,我可以调整窗口大小。事实证明,height-for width 几何管理的文档说:
接下来,顶层将使用最小宽度使用 gtk_widget_get_preferred_height_for_width()[...] 查询与该宽度相关的最小高度。最小宽度的最小高度通常用于在顶层设置最小尺寸约束(除非明确使用 gtk_window_set_geometry_hints() 代替)。
因此,这种行为是预期的,因为窗口使用最小宽度的高度作为其最小高度,导致前面提到的极端情况。这似乎是违反直觉的,因为在我的情况和文档中使用的示例(标签中的文本流)中,当宽度最小时,高度将是最大的,反之亦然。只有在实际分配可用空间时,gtk 才会考虑在较大的宽度允许时分配较小的高度。即使在窗口的默认大小和大小请求中使用高宽度时,也只会考虑容器的最小宽度来导出所需的窗口高度。
文档已经以某种方式包含了一种解决方法,即几何提示。但这似乎是一种冗长而静态的窗口大小调整方式,因为理论上可以使用窗口的默认宽度以及 height-for-width-function 轻松确定所有内容的大小。 size-allocation 已经按预期工作,只有 size-negotiation 取消了 height-for-width 函数可能带来的好处。是否有任何不错的方式来实现修复窗口大小所需的功能?
【问题讨论】:
-
你可以从GtkFlowBox获得灵感吗?
-
@nielsdg GtkFlowBox 的问题在于它在隐式列中对齐其项目,这对我的应用程序来说是不可接受的。当上方或下方的另一排有一个宽大的孩子时,这种行为会导致小孩子变得非常大。此外,虽然 FlowBox 似乎在匹配方向使用 height-for-width-sizing 我无法在 gtkflowbox.c 中找到它的实际实现
-
GtkFlowBox 的问题是我编写自己的容器的原因,请参阅stackoverflow.com/questions/64617479/…。在实施了一个相当讨厌的解决方法之后,我现在尝试编写容器来提供它作为这个旧问题的答案。
-
你可以看看 Geary 中的一些代码,它可以满足你的需求:gitlab.gnome.org/GNOME/geary/-/blob/mainline/src/client/…
-
@JamesWestman 据我所知,Geary 没有处理我所描述的问题。但是,由于它几乎可以满足我的要求,因此我要感谢您的提示。我将在我关于 GtkFlowBox 的旧帖子中参考您的想法。