В проекте Ubuntu Accomplishments у нас есть несколько необычных ошибок:
А именно, что у нас есть окно с 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 для обновления представлений.
Код для проекта здесь - кто-нибудь может порекомендовать, как мы можем решить эти две проблемы?
источник
Ответы:
Хорошо, как мы уже выяснили, как это исправить, я опишу решение здесь, на случай, если у кого-то еще возникнет эта проблема.
Хитрость заключается в том, чтобы поместить GtkIconView в GtkScrolledWindow и установить для его hscrollbar_policy значение «always». Затем должен использоваться сигнал проверки изменения размера, чтобы реагировать, когда пользователь изменяет размер окна (обратите внимание, что его необходимо проверить, изменился ли размер, поскольку сигнал испускается также, например, когда окно перетаскивается).
Когда размер изменяется, модель, используемую GtkIconView, должна быть очищена и воссоздана, так как это запускает GtkIconView, правильно перераспределяя вновь полученное пространство (или сокращается). Кроме того, в результате горизонтальная полоса прокрутки никогда не будет видна, поскольку GtkIconView использует ровно столько места, сколько использует GtkScrolledWindow.
источник
Мое предпочтительное решение этой проблемы - очень маленький подкласс Gtk.IconView:
Переопределение get_preferred_width позволяет представлению быть сколь угодно узким. Обратный вызов с выделением размера инициирует ретрансляцию, установив число столбцов в 1 и обратно.
источник
Вы также можете установить столбцы в 0 и обратно -1, когда размер изменяется. Таким образом, значки не будут отменены:
(Это должно быть сделано в дополнение к ответу @ rafalcieslak .)
источник