Tuyên bố miễn trừ trách nhiệm: Tôi không biết gì về nó một cách nhanh chóng cho đến khi tôi đọc bài viết của bạn hoặc về lập trình gui nói chung cho vấn đề đó. Vì vậy, tôi thành thật không có doanh nghiệp cố gắng trả lời câu hỏi này :)
Điều đó nói rằng, nhanh chóng là một dự án gọn gàng. Tôi đã quét sơ lược nguồn soạn sẵn và xác định các cách tiếp cận tiềm năng sau để thêm tùy chọn kiểu danh sách được hỗ trợ ListStore:
- 'Monkey-patch' lấy và đặt widget_methods vào một tiện ích TreeView cổ (mô hình w / ListStore) như được định nghĩa trong dữ liệu / ui / Preferences $ PRO DỰNAME $ Dialog.ui với glade.
- Triển khai
set_widget_from_preference
và set_preference
trong lớp con của PreferencesDialog của dự án (lớp con là Tùy chọn $ PRO DỰNAME $ Dialog) và làm một cái gì đó khác biệt khi key
hoặc widget
là tiện ích TreeView được ListStore hỗ trợ.
- Viết một lớp con tùy chỉnh của gtk.TreeView với một tiện ích tùy chỉnh phù hợp cho glade .
Để kiểm tra chúng, tôi đã thực hiện cả ba ý tưởng này - mỗi ý tưởng đều hoạt động như dự định và AFAICT, giống hệt nhau. Cuối cùng, thứ ba (đặc biệt) có vẻ sạch sẽ nhất đối với tôi, và gần hơn với các quy ước được sử dụng trong suốt bản tóm tắt, mặc dù ban đầu mong đợi điều ngược lại.
Dưới đây là các bước tôi làm theo cho số ba ...
Sử dụng glade qua quickly design
(nhanh chóng 11.10, btw) và làm theo hướng dẫn này một cách lỏng lẻo (phần 2) , thêm tiện ích ScrolledWindow vào Tùy chọn $ PRO DỰNAME $ Dialog.ui, thả TreeView vào đó, đặt tên cho TreeView language_treeview
. Tạo một mô hình ListStore mới cho TreeView khi được nhắc và đặt tên là ngôn ngữ_liststore, v.v ... cuối cùng tôi đã kết thúc với một cái gì đó như thế này:
Tiếp theo, thêm một danh mục glade (data / ui / Preferences_ $ PRO DỰNAME $ _treeview.xml) với các nội dung sau:
<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>
Sau đó, chỉnh sửa Tùy chọn $ PRO DỰNAME $ Dialog.ui, thêm ...
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
... lên trên cùng, dưới thẻ yêu cầu. Và thay đổi thuộc tính lớp của Language_treeview thành Preferences $ PRO DỰNAME $ TreeView, để chuẩn bị cho bước sau.
Cuối cùng, thêm phần tử sau vào danh sách widget_methods trong Tùy chọn $ PRO DỰNAME $ Dialog.py
'language_treeview': ['get_languages', 'set_languages', 'button-release-event']
Và ở cuối cùng một tệp (Tùy chọn $ PRO DỰNAME $ Dialog.py), hãy thêm
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
Nếu bạn muốn thấy những nỗ lực của tôi cho một và hai, tôi rất vui khi bắt buộc.
Chỉnh sửa: Đối với người đọc thông thường, thay thế bất kỳ sự xuất hiện nào của $ PRO DỰNAME $ bằng tên thực tế của dự án nhanh chóng của bạn (như được chỉ định trong quickly create
).
HTH!