Dalam proyek Ubuntu Accomplishments kami mengalami beberapa bug yang tidak biasa:
Yaitu bahwa kita memiliki jendela dengan GtkNotebook dan GtkIconView pada halaman dan yang lain di halaman lain.
Ketika pengguna mengubah ukuran jendela, tampilan ikon tidak secara otomatis mengisi ruang dengan ikon (mereka tetap dalam tata letak kolom aslinya) tetapi jika pengguna mengubah halaman GtkNotebook dan dengan demikian menyegarkan tampilan ikon sehingga ruang diambil seperti yang diharapkan. Bagaimana kita dapat secara otomatis menggunakan ruang ketika mengubah ukuran jendela?
Yang lebih memprihatinkan adalah bahwa ketika jendela muncul, kita dapat mengubah ukurannya lebih kecil - sepertinya tampilan ikon menghalangi kita untuk mengubah ukuran dan kemudian memiliki wilayah yang dapat digulir untuk ikon.
Kode terlihat seperti ini. ListStores yang menggerakkan 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)
Selain ini, kami tidak benar-benar mencari-cari dengan IconViews, kami hanya menambahkan konten ke ListStores untuk memperbarui tampilan.
Kode untuk proyek ada di sini - adakah yang bisa merekomendasikan bagaimana kita dapat memperbaiki kedua masalah ini?
sumber
Jawaban:
Oke, seperti yang kita ketahui bagaimana cara memperbaikinya, saya akan menjelaskan solusinya di sini, kalau-kalau ada orang lain yang memiliki masalah ini.
Caranya adalah dengan menempatkan GtkIconView di GtkScrolledWindow , dan mengaturnya hscrollbar_policy ke "always". Kemudian, tanda centang ukuran harus digunakan, untuk bereaksi ketika pengguna mengubah ukuran jendela (perhatikan bahwa itu harus diperiksa jika ukurannya telah berubah, untuk sinyal dipancarkan juga ketika misalnya jendela diseret sekitar).
Ketika ukurannya berubah, model yang digunakan oleh GtkIconView harus dihapus dan dibuat ulang, karena ini memicu GtkIconView mengalokasikan kembali ruang yang baru diperoleh dengan benar (atau menyusut). Juga, sebagai akibatnya scrollbar horizontal tidak akan pernah terlihat, karena GtkIconView menggunakan ruang yang persis sama dengan yang digunakan GtkScrolledWindow.
sumber
Solusi pilihan saya untuk masalah ini adalah subkelas Gtk.IconView yang sangat kecil:
Override get_preferred_width memungkinkan tampilan menjadi sempit. Callback yang mengalokasikan ukuran memaksa relayout dengan mengatur jumlah kolom ke 1 dan kembali.
sumber
Anda juga dapat mengatur kolom ke 0 dan kembali ke -1 saat ukurannya berubah. Dengan cara ini ikon tidak akan dipilih:
(Hal ini harus dilakukan selain untuk jawaban @ rafalcieslak ini .)
sumber