如何让IconView中的图标均匀分布?

2 投票
3 回答
640 浏览
提问于 2025-04-17 05:25

我有一个gtk.IconView,里面放了好几个图标。有时候我会调整窗口的大小,以便能看到更多的图标。当我这么做的时候,增加的空间并不是在所有列之间均匀分配的。相反,所有的额外空间都集中在右边,直到有足够的空间来放下一列新的图标。

我在文档中没有找到可以让我自动做到这一点的方法。我需要检查窗口大小变化的信号,然后手动设置列和行之间的间距吗?如果是的话,我应该使用哪个大小变化的信号呢?

这里有张我想表达的图片。我用红色标出了多出来的空间。

enter image description here

这是我希望看到的效果(当然,间隙应该均匀分布,而不是我糟糕的MS Paint作品那样)。

enter image description here

3 个回答

0

使用事件 size_allocate。

我定义了我的类:

class toto(Gtk.IconView):
    def __init__(self):
        super(toto,self).__init__()
        self.connect("size_allocate",self.resize)
        self.set_columns(4)

然后我修改了工作列的数量

def resize(self,_iv,_rect):
    print("X",rect.x)
    print("Y",rect.y)
    print("W",rect.width)
    print("H",rect.height)
    # calculate number of columns, let's say 3
    _cols=3
    self.set_columns(_cols)

对我来说,这似乎有效。

0

是的,看起来你可能需要自己去做这个。关于信号的部分,我建议你检查一下 GtkContainer::check-resize

1

我们在使用Ubuntu的成就查看器时遇到了一个问题,经过努力解决后,我想分享我们的解决方案。

关键在于把GtkIconView放在GtkScrolledWindow里面,并把它的水平滚动条设置为“始终显示”。接下来,需要使用一个检查大小变化的信号,这样当用户调整窗口大小时就能做出反应(注意,这个信号在窗口被拖动时也会被触发,所以要检查一下大小是否真的变化了)。当窗口大小变化时,GtkIconView使用的模型需要被清空并重新创建,这样可以确保GtkIconView能够正确地利用新获得的空间(或者缩小空间)。另外,结果是水平滚动条将永远不会出现,因为GtkIconView正好使用了GtkScrolledWindow所使用的空间。

撰写回答