GtkIconView จะไม่เติมไอคอนโดยอัตโนมัติเมื่อผู้ใช้ปรับขนาดหน้าต่าง


9

ในโครงการความสำเร็จของ Ubuntu เรากำลังพบข้อผิดพลาดเล็กน้อยบางประการ:

คือเรามีหน้าต่างที่มี GtkNotebook และ GtkIconView ในหน้าหนึ่งและอีกหน้าต่างหนึ่งในอีกหน้าหนึ่ง

เมื่อผู้ใช้ปรับขนาดหน้าต่างใหม่ไอคอนวิวจะไม่เติมช่องว่างโดยอัตโนมัติด้วยไอคอน (อยู่ในรูปแบบคอลัมน์เดิม) แต่หากผู้ใช้เปลี่ยนหน้า GtkNotebook และทำให้การรีเฟรชไอคอนดูพื้นที่นั้นเกิดขึ้นตามที่คาดไว้ เราจะใช้พื้นที่โดยอัตโนมัติเมื่อปรับขนาดหน้าต่างได้อย่างไร

สิ่งที่เกี่ยวข้องเพิ่มเติมคือเมื่อหน้าต่างปรากฏขึ้นเราสามารถปรับขนาดให้เล็กลง - ดูเหมือนว่าไอคอนวิวกำลังบล็อกเราจากการปรับขนาดแล้วมีพื้นที่เลื่อนสำหรับไอคอน

รหัสมีลักษณะเช่นนี้ ListStores ที่ขับ 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)

นอกจากนี้เราไม่ได้ใช้ 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.