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


9

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

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


Просто объяснение: когда пользователь изменяет страницы Notebook, код приложения очищает базовую модель и снова добавляет все элементы, что является причиной для обновления GtkIconView и использования пустого пространства.
Rafał Cieślak

Ответы:


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 и обратно.


1

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

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

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


Почему это в дополнение к ответу rafalcieslak? Если вы измените количество столбцов, вы получите ретрансляцию; в любом случае перестраивать модель было бы бессмысленно.
Скарни
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.