Penafian: Saya tidak tahu apa-apa tentang cepat sampai saya membaca posting Anda, atau tentang pemrograman gui secara umum dalam hal ini. Karena itu saya sejujurnya tidak punya usaha untuk menjawab pertanyaan ini :)
Konon, cepat adalah proyek yang rapi. Saya memindai sumber boilerplate secara singkat dan mengidentifikasi pendekatan potensial berikut untuk menambahkan preferensi gaya daftar yang didukung ListStore:
- 'Monkey-patch' dapatkan dan atur widget_methods ke widget TreeView stok (dengan model ListStore) sebagaimana didefinisikan dalam data / ui / Preferensi $ PROYEKNAME $ Dialog.ui dengan glade.
- Terapkan
set_widget_from_preference
dan set_preference
dalam subkelas PreferensiDialog proyek (subkelasnya adalah Preferensi $ PROYEKTOR $ Dialog), dan lakukan sesuatu yang berbeda ketika key
atau widget
widget TreeView yang didukung ListStore.
- Tulis subkelas kustom gtk.TreeView dengan widget khusus yang cocok untuk glade .
Untuk mengujinya, saya menerapkan ketiga gagasan ini - masing-masing berfungsi sebagaimana dimaksud, dan AFAICT, secara identik. Pada akhirnya, yang ketiga (khususnya) tampak paling bersih bagi saya, dan lebih dekat dengan konvensi yang digunakan di seluruh pelat, meskipun pada awalnya mengharapkan yang sebaliknya.
Berikut langkah-langkah yang saya ikuti untuk nomor tiga ...
Menggunakan glade via quickly design
(cepat 11.10, btw), dan secara longgar mengikuti tutorial ini (bagian 2) , tambahkan widget ScrolledWindow ke Preferensi $ PROYEKNAME $ Dialog.ui, letakkan TreeView ke atasnya, beri nama TreeView language_treeview
. Buat model ListStore baru untuk TreeView ketika diminta, dan beri nama language_liststore, dll ... akhirnya saya berakhir dengan sesuatu seperti ini:
Selanjutnya, tambahkan katalog glade (data / ui / preferensi_ $ PROJECTNAME $ _treeview.xml) dengan konten berikut:
<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>
Kemudian, edit Preferensi $ PROYEKNAMA $ Dialog.ui, menambahkan ...
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
... ke atas, di bawah tag yang diperlukan. Dan ubah atribut kelas language_treeview ke Preferensi $ PROYEKNAME $ TreeView, sebagai persiapan untuk langkah selanjutnya.
Terakhir, tambahkan elemen berikut ke daftar widget_methods di Preferensi $ PROYEKNAME $ Dialog.py
'language_treeview': ['get_languages', 'set_languages', 'button-release-event']
Dan di akhir file yang sama (Preferensi $ PROJECTNAME $ Dialog.py), tambahkan
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
Jika Anda tertarik melihat upaya saya untuk satu dan dua, saya senang untuk menurut.
Sunting: Untuk pembaca biasa, ganti setiap kemunculan $ PROJECTNAME $ dengan nama sebenarnya dari proyek cepat Anda (sebagaimana ditentukan dalam quickly create
).
HTH!