GtkIconView không tự động lấp đầy không gian bằng biểu tượng khi người dùng thay đổi kích thước cửa sổ


9

Trong dự án Hoàn thành Ubuntu, chúng tôi gặp một số lỗi bất thường:

Cụ thể là chúng tôi có một cửa sổ với GtkNotebook và GtkIconView trên một trang và một cửa sổ khác trên một trang khác.

Khi người dùng thay đổi kích thước cửa sổ, iconview không tự động lấp đầy không gian bằng các biểu tượng (chúng vẫn ở trong bố cục cột ban đầu của chúng) nhưng nếu người dùng thay đổi các trang GtkNotebook và do đó làm mới biểu tượng xem không gian sẽ được chiếm như mong đợi. Làm thế nào chúng ta có thể tự động sử dụng không gian khi thay đổi kích thước cửa sổ?

Điều đáng quan tâm hơn là khi cửa sổ xuất hiện, chúng ta có thể thay đổi kích thước nhỏ hơn - có vẻ như iconview đang chặn chúng ta thay đổi kích thước và sau đó có một vùng có thể cuộn cho các biểu tượng.

Mã trông như thế này. ListStores điều khiển 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)

Khác với điều này, chúng tôi không thực sự chọc ngoáy với IconView, chúng tôi chỉ thêm nội dung vào ListStores để cập nhật lượt xem.

Mã cho dự án là ở đây - bất cứ ai cũng có thể đề nghị làm thế nào chúng ta có thể khắc phục hai vấn đề này?


Chỉ cần một lời giải thích: khi người dùng thay đổi các trang Notebook, mã ứng dụng sẽ xóa mô hình bên dưới và thêm lại tất cả các mục, đó dường như là lý do để GtkIconView làm mới và sử dụng không gian trống.
Rafał Cieślak

Câu trả lời:


3

Được rồi, vì chúng tôi đã tìm ra cách khắc phục vấn đề này, tôi sẽ mô tả giải pháp ở đây, trong trường hợp bất kỳ ai khác có vấn đề này.

Mẹo nhỏ là đặt GtkIconView trong GtkScrolledWindow và đặt hscrollbar_policy thành "luôn luôn". Sau đó, phải sử dụng tín hiệu thay đổi kích thước kiểm tra để phản ứng khi người dùng thay đổi kích thước cửa sổ (lưu ý rằng nó phải được kiểm tra nếu kích thước đã thay đổi, vì tín hiệu cũng được phát ra khi ví dụ cửa sổ được kéo xung quanh).

Khi kích thước thay đổi, mô hình được sử dụng bởi GtkIconView phải được xóa và tạo lại, vì điều này kích hoạt GtkIconView phân bổ lại không gian vừa đạt được (hoặc thu hẹp). Ngoài ra, kết quả là thanh cuộn ngang sẽ không bao giờ được nhìn thấy, vì GtkIconView sử dụng chính xác không gian đó như GtkScrolledWindow sử dụng.


Điều này đã vô cùng hữu ích, cảm ơn câu trả lời! Tôi đã bị ảnh hưởng bởi nó trên lp: qreator và với sự sửa chữa của bạn, số lượng cột biểu tượng trong chế độ xem biểu tượng chính sẽ động khi thay đổi kích thước một lần nữa.
David Planella

1

Giải pháp ưa thích của tôi cho vấn đề này là một lớp con rất nhỏ của 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 ()]]

Ghi đè get_preferred_creen cho phép chế độ xem được thu hẹp tùy ý. Gọi lại phân bổ kích thước buộc chuyển tiếp bằng cách đặt số lượng cột thành 1 và trở lại.


1

Bạn cũng có thể đặt các cột thành 0 và quay lại -1 khi kích thước thay đổi. Bằng cách này, các biểu tượng sẽ không được bỏ chọn:

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

(Điều này nên được thực hiện ngoài để trả lời @ rafalcieslak của .)


Tại sao điều này ngoài câu trả lời của rafalcieslak? Nếu bạn thay đổi số lượng cột, bạn sẽ nhận được chuyển tiếp; xây dựng lại mô hình dù sao cũng sẽ là vô nghĩa.
cscarney
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.