在 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 的回答。