Im Ubuntu Accomplishments-Projekt gibt es einige ungewöhnliche Fehler:
Das heißt, wir haben ein Fenster mit einem GtkNotebook und einem GtkIconView auf einer Seite und einem anderen auf einer anderen Seite.
Wenn der Benutzer die Größe des Fensters ändert, füllt die Symbolansicht den Bereich nicht automatisch mit Symbolen (sie bleiben in ihrem ursprünglichen Spaltenlayout). Wenn der Benutzer jedoch die GtkNotebook-Seiten ändert und somit die Symbolansicht aktualisiert, wird der Bereich wie erwartet belegt. Wie können wir den Platz beim Ändern der Fenstergröße automatisch nutzen?
Noch besorgniserregender ist jedoch, dass wir die Größe des Fensters verkleinern können, wenn es angezeigt wird. Es scheint, als würde uns die Symbolansicht daran hindern, die Größe zu ändern, und dann einen scrollbaren Bereich für die Symbole haben.
Der Code sieht so aus. Die ListStores, die die IconViews steuern:
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)
Abgesehen davon stöbern wir nicht wirklich in den IconViews herum, sondern fügen lediglich Inhalte zu den ListStores hinzu, um die Ansichten zu aktualisieren.
Der Code für das Projekt ist hier - kann jemand empfehlen, wie wir diese beiden Probleme beheben können?
quelle
Antworten:
Okay, da wir herausgefunden haben, wie dies behoben werden kann, werde ich hier die Lösung beschreiben, falls jemand anderes dieses Problem hat.
Der Trick besteht darin , die GtkIconView in einem GtkScrolledWindow zu platzieren und die hscrollbar_policy auf "immer" zu setzen. Dann muss ein Check-Resize-Signal verwendet werden, um zu reagieren, wenn der Benutzer die Größe des Fensters ändert (beachten Sie, dass überprüft werden muss, ob sich die Größe geändert hat, da das Signal auch ausgegeben wird, wenn z. B. das Fenster herumgezogen wird).
Wenn sich die Größe ändert, muss das von GtkIconView verwendete Modell gelöscht und neu erstellt werden, da dies dazu führt, dass GtkIconView den neu gewonnenen Speicherplatz ordnungsgemäß neu zuweist (oder verkleinert). Infolgedessen wird die horizontale Bildlaufleiste nie angezeigt, da GtkIconView genau so viel Speicherplatz benötigt wie GtkScrolledWindow.
quelle
Meine bevorzugte Lösung für dieses Problem ist eine sehr kleine Unterklasse von Gtk.IconView:
Durch das Überschreiben von get_preferred_width kann die Ansicht beliebig eng sein. Der Rückruf zur Größenzuweisung erzwingt ein Relayout, indem die Anzahl der Spalten auf 1 und zurück gesetzt wird.
quelle
Sie können die Spalten auch auf 0 und zurück auf -1 setzen, wenn sich die Größe ändert. Auf diese Weise werden die Symbole nicht abgewählt:
(Dies sollte zusätzlich zu der Antwort von @ rafalcieslak erfolgen .)
quelle