Kafayı yiyecektim arkadaşlar. Basit bir dosya gezgini yapacaktım Qt'de. İlk düşüncem, QTreeWidget'e item'ları tek tek doldurup, sinyal-slot'ları bağlamaktı. "İşte bu, iki saatte biter" dedim. Ama sonra, "Hadi biraz düzgün öğrenelim" diyip QFileSystemModel ve QTreeView ile Model/View mimarisine daldım. İlk 30 dakikada, "Bu kadar abstract class, bu kadar inheritance zinciri ne ya? Kesin over-engineering bu!" diye söylenip durdum.
Modeli oluşturup view'a set ettiğim an, olay başka bir boyuta taşındı. Kod şuna benzer bir şeydi:
C++:
QFileSystemModel model = new QFileSystemModel();
model->setRootPath(QDir::homePath());
QTreeView treeView = new QTreeView();
treeView->setModel(model);
Ve bam! Tüm dosya sistemi ağacı, sürükle-bırak desteği, ikonlar, sıralama... Hepsi hazır. Meğerse QTreeWidget ile uğraşırken kendi tekerleğimi yeniden icat ediyormuşum. Model/View'ın gücü, veri ile onu göstermek için kullandığın widget'ı birbirinden ayırması. Veri değişti mi, model sinyal veriyor, view otomatik güncelleniyor. Sihir gibi.
Asıl olay, QFileSystemModel ile yetinmeyip kendi özel modelimi (QAbstractItemModel'den türeterek) yazmaya kalktığımda patladı. Evet, başta index() ve parent() fonksiyonlarını yazarken beynim eridi. StackOverflow'da bile tam istediğim cevabı bulamadım. Ama meğerse, bu zorluk sonsuz bir esneklik getiriyormuş.
Aynı veri modelimi, bir QTreeView, bir QListView ve bir de tabloda göstermek istedim. Ve şaka gibi ama, sadece view'ı değiştirmem yetti. Veri kaynağı aynı kaldı. Filtering, sorting, özel renklendirmeler... Hepsi model katmanında, temiz bir şekilde halledilebiliyor. QTreeWidget'te olsa, her biri için ayrı kod yazacaktım.
Kısacası, ilk bakışta gereksiz karmaşık gelen bu mimari, proje büyüdükçe ve değiştikçe hayat kurtarıcı oluyor. Öğrenme eğrisi dik, evet. İlk kurulum için biraz daha kod, evet. Ama uzun vadede bakımı, genişletmesi inanılmaz rahat. Şimdi basit listeler için bile direk widget kullanmadan önce iki kere düşünüyorum.
Siz de Model/View ile ilk tanışmanızda böyle "Bu ne saçmalık?" diye düşünüp sonradan vazgeçilmeziniz mi oldu? Yoksa hala QListWidget, QTreeWidget takılıp, "Bana bu yetiyor" diyenler var mı aramızda? Tartışalım!