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


9

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

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

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

不过,更令人担忧的是,当窗口出现时,我们可以将其调整为较小的尺寸-好像iconview阻止了我们调整大小,然后为图标提供了一个可滚动区域。

代码看起来像这样。驱动IconView的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)

除此之外,我们并没有真正使用IconView,而是只向ListStore添加内容以更新视图。

该项目的代码在这里 -谁能建议我们如何解决这两个问题?


只是一个解释:当用户更改Notebook页面时,应用程序代码将清除基础模型并再次添加所有项目,这似乎是GtkIconView刷新并使用空白空间的原因。
拉斐尔·西耶拉克(RafałCieślak)2012年

Answers:


3

好的,由于我们已经找到解决方法,因此我将在此处描述解决方案,以防其他人遇到此问题。

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

当大小更改时,必须清除并重新创建GtkIconView使用的模型,因为这会触发GtkIconView正确地重新分配新获得的空间(或缩小)。而且,结果是将永远看不到水平滚动条,因为GtkIconView使用的空间恰好等于GtkScrolledWindow使用的空间。


这非常有帮助,感谢您的回答!我在lp:qreator上受到它的影响,并且通过修复,重新调整大小后,主图标视图中的图标列数是动态的。
大卫·普拉内拉

1

对于这个问题,我的首选解决方案是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可使视图任意缩小。通过将列数设置为1并返回,size-allocate回调强制进行重新布局。


1

您还可以将列设置为0,并在大小更改时重新设置为-1。这样,将不会取消选择图标:

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

(这应该是做除了@ rafalcieslak的答案。)


为什么除了rafalcieslak的答案之外,这又是什么?如果您更改列数,则会获得重新布局;无论如何重建模型都是没有意义的。
cscarney 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.