คำเตือน: ฉันไม่รู้อะไรเกี่ยวกับอย่างรวดเร็วจนกว่าฉันจะอ่านโพสต์ของคุณหรือเกี่ยวกับการเขียนโปรแกรม Gui โดยทั่วไปสำหรับเรื่องนั้น ดังนั้นฉันจึงไม่มีธุรกิจที่พยายามตอบคำถามนี้ :)
ที่กล่าวว่าอย่างรวดเร็วเป็นโครงการที่เรียบร้อย ฉันสแกนแหล่งข้อมูลสำเร็จรูปในเวลาสั้น ๆ และระบุแนวทางที่เป็นไปได้ดังต่อไปนี้สำหรับการเพิ่มการตั้งค่าสไตล์ลิสต์ ListStore ที่ได้รับการสนับสนุน:
- 'Monkey-patch' รับและตั้งค่า widget_methods บนวิดเจ็ต TreeView หุ้น (โมเดล w / ListStore) ตามที่กำหนดไว้ใน data / ui / Preferences $ PROJECTNAME $ Dialog.ui พร้อม glade
- ดำเนินการ
set_widget_from_preference
และset_preference
ใน subclass โครงการของ PreferencesDialog (subclass คือการตั้งค่า $ ProjectName $ Dialog) และทำสิ่งที่แตกต่างกันเมื่อkey
หรือwidget
เป็น ListStore ของคุณได้รับการสนับสนุน TreeView วิดเจ็ต
- เขียนเป็น subclass กำหนดเองของ gtk.TreeView กับการจับคู่ที่กำหนดเองเครื่องมือสำหรับบึง
ในการทดสอบพวกเขาฉันได้นำความคิดทั้งสามนี้ไปปฏิบัติตามที่ตั้งใจและ AFAICT เหมือนกัน ในท้ายที่สุดคนที่สาม (โดยเฉพาะ) ดูเหมือนจะสะอาดที่สุดสำหรับฉันและใกล้กับอนุสัญญาที่ใช้ทั่วหม้อไอน้ำแม้ว่าในตอนแรกคาดหวังสิ่งตรงกันข้าม
นี่คือขั้นตอนที่ฉันติดตามสำหรับหมายเลขสาม ...
การใช้บึงผ่านquickly design
(อย่างรวดเร็ว 11.10, BTW) และหลวม ๆ ดังต่อไปนี้การกวดวิชานี้ (ตอน 2)เพิ่ม ScrolledWindow เครื่องมือที่จะตั้งค่า $ ProjectName $ Dialog.ui วาง TreeView บนมันชื่อ language_treeview
TreeView สร้างรูปแบบ ListStore ใหม่สำหรับ TreeView เมื่อได้รับแจ้งและตั้งชื่อเป็น language_liststore และอื่น ๆ ... ในที่สุดฉันก็จบลงด้วยสิ่งนี้:
ถัดไปเพิ่มแคตตาล็อก Glade (data / ui / preferences_ $ PROJECTNAME $ _treeview.xml) ด้วยเนื้อหาต่อไปนี้:
<glade-catalog name="preferences_$PROJECTNAME$_treeview" domain="glade-3"
depends="gtk+" version="1.0">
<glade-widget-classes>
<glade-widget-class title="$PROJECTNAME$ Preferences TreeView" name="Preferences$PROJECTNAME$TreeView"
generic-name="Preference$PROJECTNAME$TreeView" parent="GtkTreeView"
icon-name="widget-gtk-treeview"/>
</glade-widget-classes>
</glade-catalog>
จากนั้นแก้ไขการตั้งค่า $ PROJECTNAME $ Dialog.ui เพิ่ม ...
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
... ไปด้านบนภายใต้แท็กต้องการ และเปลี่ยนแอตทริบิวต์ class ของ language_treeview เป็น Preferences $ PROJECTNAME $ TreeView เพื่อเตรียมพร้อมสำหรับขั้นตอนต่อไป
สุดท้ายให้เพิ่มองค์ประกอบต่อไปนี้ในรายการ widget_methods ใน Preferences $ PROJECTNAME $ Dialog.py
'language_treeview': ['get_languages', 'set_languages', 'button-release-event']
และในตอนท้ายของไฟล์เดียวกัน (การตั้งค่า $ PROJECTNAME $ Dialog.py) ให้เพิ่ม
import gtk
ALL_LANGUAGES = [
'en', 'uk', 'de', 'fr', # ... much longer list
]
class Preferences$PROJECTNAME$TreeView(gtk.TreeView):
__gtype_name__ = "Preferences$PROJECTNAME$TreeView"
def __init__(self, *args):
super(Preferences$PROJECTNAME$TreeView, self).__init__(*args)
self.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
# loads the liststore with all languages,
# selecting/highlighting in the treeview those
# already retrieved from previously saved preferences
def set_languages(self, preferred_languages):
model = self.get_model()
for row, lang in enumerate(ALL_LANGUAGES):
model.append([lang])
if lang in preferred_languages:
self.get_selection().select_iter(model.get_iter(row))
# collects only the selected languages in the treeview
# to save in the preferences database
def get_languages(self):
model, rows = self.get_selection().get_selected_rows()
result = [model.get_value(model.get_iter(row), 0) for row in rows]
return result
หากคุณสนใจที่จะเห็นความพยายามของฉันหนึ่งและสองฉันยินดีที่จะบังคับ
แก้ไข:สำหรับผู้อ่านทั่วไปให้แทนที่$ PROJECTNAME $ด้วยชื่อจริงของโครงการอย่างรวดเร็วของคุณ(ตามที่ระบุในquickly create
)
HTH!