当用户调整窗口大小时,GtkIconView 不会自动用图标填充空间

当用户调整窗口大小时,GtkIconView 不会自动用图标填充空间

在 Ubuntu Accomplishments 项目中,我们遇到了一些不寻常的错误:

也就是说,我们有一个窗口,其中在一个页面上有一个 GtkNotebook 和一个 GtkIconView,在另一个页面上还有另一个窗口。

当用户调整窗口大小时,图标视图不会自动用图标填充空间(它们保持其原始列布局),但如果用户更改 GtkNotebook 页面并因此刷新图标视图,则空间会按预期被占用。我们如何在调整窗口大小时自动使用空间?

但更令人担忧的是,当窗口出现时,我们可以将其调整得更小 - 似乎图标视图阻止我们调整大小,然后为图标提供可滚动区域。

代码如下。驱动 IconViews 的 ListStore:

    self.trophystore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, bool, bool, str, str) # title, icon accomplished, locked, app, accomplishment
    self.trophystore.set_sort_column_id(COL_TITLE, Gtk.SortType.ASCENDING)
    self.trophy_icon.set_model(self.trophystore)

    self.oppstore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, bool, bool, str, str) # title, icon, accomplished, locked, app, accomplishment
    self.oppstore.set_sort_column_id(COL_TITLE, Gtk.SortType.ASCENDING)
    self.opp_icon.set_model(self.oppstore)

    self.trophy_icon.set_text_column(COL_TITLE)
    self.trophy_icon.set_pixbuf_column(COL_PIXBUF)

    self.opp_icon.set_text_column(COL_TITLE)
    self.opp_icon.set_pixbuf_column(COL_PIXBUF)

除此之外,我们并没有真正探究 IconViews,我们只是向 ListStores 添加内容来更新视图。

该项目的代码是这里- 有人能建议我们如何解决这两个问题吗?

答案1

好的,既然我们已经找到如何解决这个问题的方法,我将在这里描述解决方案,以防其他人遇到这个问题。

诀窍是将 GtkIconView 放置在 GtkScrolledWindow 中,并将其 hscrollbar_policy 设置为“always”。然后,必须使用 check-resize 信号,以便在用户调整窗口大小时做出反应(请注意,必须检查大小是否已更改,因为当窗口被拖动时也会发出信号)。

当尺寸改变时,必须清除并重新创建 GtkIconView 使用的模型,因为这会触发 GtkIconView 正确地重新分配新获得的空间(或缩小)。而且,由于 GtkIconView 使用的空间与 GtkScrolledWindow 使用的完全相同,因此水平滚动条将永远不会被看到。

答案2

我对这个问题的首选解决方案是 Gtk.IconView 的一个非常小的子类:

class FluidIconView (Gtk.IconView):
    def __init__ (self):
        Gtk.IconView.__init__ (self)
        self.connect ("size-allocate", FluidIconView.on_size_allocate)

    def do_get_preferred_width (self):
        return (0,0)

    def on_size_allocate (self, allocation):
        [self.set_columns (m) for m in [1,self.get_columns ()]]

get_preferred_width 覆盖允许视图任意变窄。size-allocate 回调通过将列数设置为 1 并返回来强制重新布局。

答案3

您还可以将列设置为 0,并在尺寸改变时将其重新设置为 -1。这样图标就不会被取消选择:

iconview.set_columns(0)
iconview.set_columns(-1)

(这应该此外@rafalcieslak 的回答

相关内容