W projekcie Osiągnięcia Ubuntu mamy kilka niezwykłych błędów:
Mianowicie, że mamy okno z GtkNotebook i GtkIconView na stronie i innym na innej stronie.
Gdy użytkownik zmienia rozmiar okna, widok ikon nie automatycznie wypełnia przestrzeń ikonami (pozostają w oryginalnym układzie kolumn), ale jeśli użytkownik zmieni strony GtkNotebook, a tym samym odświeży widok ikon, miejsce zostanie zajęte zgodnie z oczekiwaniami. Jak możemy automatycznie wykorzystać przestrzeń podczas zmiany rozmiaru okna?
Bardziej niepokojące jest to, że kiedy pojawi się okno, możemy zmienić jego rozmiar na mniejszy - wygląda na to, że widok ikon blokuje nam zmianę rozmiaru, a następnie posiadanie przewijalnego regionu dla ikon.
Kod wygląda następująco. ListStores, które sterują 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)
Poza tym, tak naprawdę nie przeszukujemy IconViews, po prostu dodajemy zawartość do ListStores, aby zaktualizować widoki.
Kod projektu znajduje się tutaj - czy ktoś może polecić, jak możemy rozwiązać te dwa problemy?
źródło
Odpowiedzi:
Ok, jak już wymyśliliśmy, jak to naprawić, opiszę tutaj rozwiązanie, na wypadek, gdyby ktoś miał ten problem.
Sztuką jest umieszczenie GtkIconView w GtkScrolledWindow i ustawienie jego hscrollbar_policy na „always”. Następnie należy użyć sygnału sprawdzania-zmiany rozmiaru, aby zareagować, gdy użytkownik zmieni rozmiar okna (zwróć uwagę, że należy sprawdzić, czy rozmiar się zmienił, ponieważ sygnał jest emitowany również wtedy, gdy np. Okno jest przeciągane).
Gdy rozmiar się zmienia, model używany przez GtkIconView musi zostać wyczyszczony i ponownie utworzony, ponieważ powoduje to prawidłowe przestawienie nowo zdobytej przestrzeni (lub zmniejszenie) przez GtkIconView. Ponadto, w wyniku tego poziomy pasek przewijania nigdy nie będzie widoczny, ponieważ GtkIconView zajmuje dokładnie tyle miejsca, ile używa GtkScrolledWindow.
źródło
Moim preferowanym rozwiązaniem tego problemu jest bardzo mała podklasa Gtk.IconView:
Przesłonięcie get_preferred_width pozwala na dowolne zawężenie widoku. Oddzwonienie alokujące rozmiar wymusza przekazanie przez ustawienie liczby kolumn na 1 i wstecz.
źródło
Możesz także ustawić kolumny na 0 i z powrotem na -1, gdy zmieni się rozmiar. W ten sposób ikony nie zostaną odznaczone:
(Należy to zrobić oprócz odpowiedzi @ rafalcieslak .)
źródło