사용자가 창 크기를 조정할 때 GtkIconView가 아이콘으로 공간을 자동으로 채우지 않습니다.


9

Ubuntu Accomplishments 프로젝트에는 몇 가지 특이한 버그가 있습니다.

즉, 페이지에는 GtkNotebook과 GtkIconView가 있고 다른 페이지에는 GtkIconView가있는 창이 있습니다.

사용자가 창 크기를 조정하면 iconview는 자동으로 아이콘으로 공간을 채우지 않지만 (원래 열 레이아웃으로 유지) GtkNotebook 페이지를 변경하여 아이콘보기를 새로 고치면 공간이 예상대로 차지합니다. 창 크기를 조정할 때 어떻게 공간을 자동으로 사용할 수 있습니까?

더 중요한 것은 윈도우가 나타날 때 더 작게 크기를 조정할 수 있다는 것입니다.

코드는 다음과 같습니다. IconView를 구동하는 ListStore :

    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를 GtkScrolledWindow에 배치하고 hscrollbar_policy를 "always"로 설정하는 것입니다. 그런 다음 사용자가 창 크기를 조정할 때 반응하기 위해 크기 조정 확인 신호를 사용해야합니다 (크기가 변경된 경우 확인해야합니다. 예를 들어, 창을 드래그 할 때에도 신호가 방출 됨).

크기가 변경되면 GtkIconView에 의해 사용 된 모델은 새로 생성 된 공간을 올바르게 재 할당 (또는 축소)하도록 트리거하기 때문에 GtkIconView에서 사용하는 모델을 지우고 다시 작성해야합니다. 또한 GtkIconView가 GtkScrolledWindow가 사용하는만큼의 공간을 사용하므로 결과적으로 가로 스크롤 막대가 표시되지 않습니다.


답변에 감사드립니다. lp : qreator에서 영향을 받았으며 수정하면 기본 아이콘보기의 아이콘 열 ​​수가 다시 크기를 조정할 때 동적입니다.
David Planella

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.