GtkIconView не автоматически заполняет пространство значком, когда пользователь изменяет размер окна

В проекте Ubuntu Accomplishments у нас есть несколько необычных ошибок:

А именно, у нас есть окно с GtkNotebook и GtkIconView на странице и другое на другой странице. [ 117]

Когда пользователь изменяет размеры окна, вид значка автоматически не заполняет пространство значками (они остаются в исходном макете столбца), но если пользователь изменяет страницы GtkNotebook и, таким образом, обновляет вид значков, пространство занимает ожидается. Как мы можем автоматически использовать пространство при изменении размера окна?

Что более важно, хотя, то, что, когда окно появляется, мы можем изменить его размер меньше - кажется, что иконка не позволяет нам изменять размеры и затем иметь область прокрутки для иконок.

Код выглядит следующим образом. ListStores, которые управляют IconViews:

    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 для обновления представлений.

Код проекта: здесь - кто-нибудь может порекомендовать, как мы можем решить эти две проблемы?

9
задан 24 April 2012 в 09:35

3 ответа

Хорошо, так как мы выяснили, как это исправить, я опишу решение здесь, на случай, если у кого-то еще возникнет эта проблема.

Хитрость заключается в том, чтобы поместить GtkIconView в GtkScrolledWindow и установить для его hscrollbar_policy значение «always». Затем должен использоваться сигнал проверки изменения размера, чтобы реагировать, когда пользователь изменяет размер окна (обратите внимание, что он должен быть проверен, изменился ли размер, поскольку сигнал испускается также, когда, например, окно перемещается).

Когда размер изменяется, модель, используемую GtkIconView, должна быть очищена и воссоздана, поскольку это запускает GtkIconView, правильно перераспределяя вновь полученное пространство (или сокращается). Кроме того, в результате горизонтальная полоса прокрутки никогда не будет видна, так как GtkIconView использует ровно столько места, сколько использует GtkScrolledWindow.

0
ответ дан 24 April 2012 в 09:35

Мое предпочтительное решение этой проблемы является очень маленьким подклассом 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 и назад.

1
ответ дан 24 April 2012 в 09:35

Вы также можете установить столбцы на 0 и обратно на -1, когда размер изменяется. Таким образом, значки не будут отменены:

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

(Это следует сделать в дополнение к ответам - @ rafalcieslak .)

0
ответ дан 24 April 2012 в 09:35

Другие вопросы по тегам:

Похожие вопросы: