GtkIconView автоматично не заповнює простір значком, коли користувач змінює розмір вікна


9

У проекті Ubuntu Досягнення у нас є кілька незвичайних помилок:

А саме, що у нас є вікно з GtkNotebook та GtkIconView на сторінці та інше на іншій сторінці.

Коли користувач переосмислює вікно, перегляд іконок не автоматично заповнює простір піктограмами (вони залишаються в їх початковому розташуванні стовпців), але якщо користувач змінює сторінки GtkNotebook і тим самим оновлює перегляд піктограм, простір займає, як очікувалося. Як ми можемо автоматично використовувати простір під час зміни вікна?

Що більш важливо, однак, це те, що коли з'являється вікно, ми можемо змінити його розмір менше - здається, ніби iconview перешкоджає нам змінювати розмір, а потім мати прокручувану область для піктограм.

Код виглядає приблизно так. 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.
Rafał Cieślak

Відповіді:


3

Гаразд, як ми розібралися, як це виправити, я опишу тут рішення, на випадок, якщо хтось ще має цю проблему.

Трюк полягає в тому, щоб розмістити GtkIconView у GtkScrollWindow та встановити його hscrollbar_policy на "завжди". Потім слід застосувати сигнал перевірки зміни розміру, щоб реагувати, коли користувач змінює розмір вікна (зверніть увагу, що його потрібно перевірити, чи змінився розмір, оскільки сигнал випромінюється і тоді, коли вікно перетягується навколо).

Коли розмір змінюється, модель, яку використовує GtkIconView, має бути очищена та відтворена, оскільки це запускає GtkIconView належним чином перерозподілити щойно здобутий простір (або скорочується). Крім того, в результаті горизонтальна смуга прокрутки ніколи не буде помічена, оскільки GtkIconView використовує саме стільки місця, скільки використовує GtkScrollWindow.


Це було надзвичайно корисно, дякую за відповідь! На мене це вплинуло на 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? Якщо ви зміните кількість стовпців, ви отримаєте ретрансляцію; перебудувати модель у будь-якому разі було б безглуздо.
cscarney
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.