【问题标题】:gtk height_for_width leading to unreasonable window heights for given width due to smaller minimum widthgtk height_for_width 由于最小宽度较小,导致给定宽度的窗口高度不合理
【发布时间】: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 的旧帖子中参考您的想法。

标签: gtk gtk3


【解决方案1】:

我搜索的方式似乎没有针对此问题的预期解决方法。 gtk 大小协商在请求大小时从下到上,在分配时从上到下。因此,我的容器无法知道其父级可以分配给它的宽度。

我通过添加一个定义每行最少子级的属性来解决了这个问题。这可用于增加最小宽度,从而降低最小高度。我只将它用于最小宽度计算,而实际上忽略了它进行实际尺寸分配,这只是我将记录的一个小细节。

本文档将作为代码示例的一部分,我将作为对我的old post 的回答提供,该示例是关于实现具有上述行为的 FlowBox。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多