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

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

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

Когда пользователь изменяет размеры окна, значок не заполняет пробелы автоматически (они остаются в исходном расположении столбцов), но если пользователь изменяет страницы 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 в 10:35

2 ответа

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

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

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

3
ответ дан 6 August 2018 в 01:37

Мое предпочтительное решение этой проблемы - очень маленький подкласс 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
ответ дан 15 August 2018 в 19:41

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

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