我在顶级窗口内的笔记本内的 hpaned 内的 GTK ScrolledWindow 内创建了一个大型 TreeView(并且顶级窗口具有有限的默认大小)。
当我在其中创建一个带有 TreeView 的 ScrolledWindow 时,它被分配的空间与 TreeView 占用的空间一样多(大于屏幕大小),并且我的顶层窗口的大小被调整为无穷大。如何限制 ScrolledWindow 的分配或其视口大小?确定其默认大小的机制是什么?
问题似乎解决了。如果设置了 POLICY_NEVER,则ScrolledWindow 的大小申请取决于其POLICY
(在各自的方向上)并且等于子窗口小部件(树视图)的申请,请参阅gtkscrolledwindow.c
:
滚动窗口策略和大小申请处理:
gtk 大小申请的工作原理如下:
- 一个小部件根据大小请求报告它发现最适合播放其内容的宽度和高度,包括孩子。
- 用户可以通过 gtk_widget_set_usize() 指定除 0 以外的宽度和/或高度来覆盖在请求尺寸时从小部件报告的宽度和/或高度。滚动窗口需要(用于实现所有三种策略类型)根据两个不同的理由请求其宽度和高度。
1)用户希望滚动窗口刚好适合它为特定维度分配的空间。
1.1) 如果用户通过为滚动窗口或其子窗口指定 usize 来为该特定维度指定具体值,则这不适用。2) 用户希望滚动窗口占用孩子对特定维度(即 POLICY_NEVER)所需的尽可能多的空间。
另外,有点明显:
3) 如果结果分配占用的空间比没有滚动窗口时子分配的空间多,用户肯定不会选择滚动窗口作为子窗口的容器。
结论:
A) 从 1) 开始:滚动窗口不应为特定维度请求比最低要求更多的空间。
B) 从 1.1) 开始:可以通过滚动窗口的使用(自动完成)或子项的使用(需要检查)来覆盖申请。
C) 来自 2) 如下:对于 POLICY_NEVER,滚动窗口只报告孩子的维度。
D)从3)如下:A)下滚动窗口child的最小宽度和最小高度至少对应于其滚动条占用的空间。
因此,如果您设置 POLICY_NEVER,则 ScrolledWindow 将请求其子级所需的所有位置(如果其子级很大,则可能会使屏幕膨胀)。否则,它将请求绘制滚动条所需的最小值。可能会为其分配比请求更多的空间,并且它将在其父级中扩大到合理的大小。
有时您可能希望拥有 2 个 ScrolledWindows,共享一个滚动条。不幸的是,不可能只为其中一个设置 POLICY_NEVER scrolled_window1.set_adjustment() = scrolled_window2.get_adjustment()
,因为 POLICIES 会影响大小申请,并且 scrolled_window1 将开始请求不可预测的(可能是巨大的)空间量。