Kısa cevap
Qt'nin MVC'si yalnızca bir veri yapısı için geçerlidir . Bir MVC uygulaması hakkında konuşurken QAbstractItemModel
veya hakkında düşünmemelisiniz QListView
.
Tüm programınız için bir MVC mimarisi istiyorsanız, Qt bu kadar "devasa" bir model / görünüm çerçevesine sahip değildir. Ancak programınızdaki her veri listesi / ağacı için, aslında kendi görünümünde bir denetleyiciye sahip olan Qt MVC yaklaşımını kullanabilirsiniz . Veri içinde veya modelin dışında; bu, kullandığınız modelin türüne bağlıdır (kendi model alt sınıfı: muhtemelen model içinde; örneğin QSqlTableModel: modelin dışında (ancak belki de önbelleğe alınmış) modelin içinde). Modellerinizi ve görünümlerinizi bir araya getirmek için, daha sonra iş mantığını uygulayan kendi sınıflarını kullanın .
Uzun cevap
Qt'nin model / görünüm yaklaşımı ve terminolojisi:
Qt, modelleri için basit görünümler sağlar . Yerleşik bir denetleyiciye sahiptirler: öğeleri seçmek, düzenlemek ve taşımak çoğu durumda bir denetleyicinin "kontrol ettiği" bir şeydir. Yani, kullanıcı girdisini yorumlamak (fare tıklamaları ve hareketleri) ve modele uygun komutları vermek.
Qt'nin modelleri aslında temel verilere sahip modellerdir. Elbette soyut modeller veri tutmaz çünkü Qt onları nasıl depolamak istediğinizi bilmiyor. Ama sen alt sınıf için veri konteynerleri ekleme ve veri erişimine modeli arabirimini yaparak ihtiyaçlarınıza bir QAbstractItemModel uzanır. Yani aslında, ben böyle yok farz sorun olduğunu sen accedere ve veri yapısında değiştirilir böylece nasıl modelini programlamak gerekir.
MVC terminolojisinde, model hem verileri hem de mantığı içerir . Qt'de, iş mantığınızın bir kısmını modelinize dahil edip etmemek veya dışarıya koymak, kendi başına bir "görünüm" olarak size kalmış. Mantığın ne anlama geldiği bile net değil: Öğeleri seçmek, yeniden adlandırmak ve taşımak? => zaten uygulandı. Onlarla hesap mı yapıyorsun? => Model alt sınıfının dışına veya içine koyun. Bir dosyadan / dosyaya veri depolamak veya yüklemek mi? => Model alt sınıfının içine koyun.
Kişisel görüşüm:
Bir programcıya iyi ve genel bir MV (C) sistemi sağlamak çok zordur . Çoğu durumda modeller basit olduğundan (örn. Sadece dizi listeleri) Qt ayrıca kullanıma hazır bir QStringListModel sağlar. Ancak verileriniz dizelerden daha karmaşıksa, verileri Qt modeli / görünüm arayüzü aracılığıyla nasıl temsil etmek istediğiniz size kalmıştır. Örneğin, 3 alanlı bir yapınız varsa (adı, yaşı ve cinsiyeti olan kişiler diyelim) 3 alanı 3 farklı sütuna veya 3 farklı role atayabilirsiniz. Her iki yaklaşımı da sevmiyorum.
Qt'nin model / görünüm çerçevesinin yalnızca basit veri yapılarını görüntülemek istediğinizde yararlı olduğunu düşünüyorum . Veriler özel tipte ise veya bir ağaçta veya listede (örneğin bir grafikte) yapılandırılmamışsa işlemek zorlaşır . Çoğu durumda listeler yeterlidir ve bazı durumlarda bile bir modelde yalnızca tek bir giriş olmalıdır. Özellikle farklı özniteliklere sahip tek bir girişi modellemek istiyorsanız (bir sınıfın bir örneği), Qt'nin model / görünüm çerçevesi, mantığı kullanıcı arayüzünden ayırmanın doğru yolu değildir.
Özetlemek gerekirse, Qt'nin model / görünüm çerçevesinin, ancak ve ancak verileriniz Qt'nin görüntüleyici widget'larından biri tarafından görüntüleniyorsa yararlı olacağını düşünüyorum . Yalnızca bir girişi tutan bir model için kendi görüntüleyicinizi yazmak üzereyseniz, örneğin uygulamanızın ayarları veya verileriniz yazdırılabilir türden değilse, bu tamamen işe yaramaz.
(Daha büyük) bir uygulamada Qt modelini / görünümünü nasıl kullandım?
Bir keresinde (bir takımda) verileri yönetmek için birden çok Qt modeli kullanan bir uygulama yazmıştım. DataRole
Her farklı model alt sınıfı için farklı bir özel tipte olan gerçek verileri tutmak için bir oluşturmaya karar verdik . Model
Tüm farklı Qt modellerini tutan bir dış model sınıfı oluşturduk . Ayrıca View
, içindeki modellere bağlı olan pencereleri (widget'lar) tutma adında bir dış görünüm sınıfı oluşturduk Model
. Dolayısıyla bu yaklaşım, kendi ihtiyaçlarımıza göre uyarlanmış genişletilmiş bir Qt MVC'dir. Hem Model
ve View
sınıfların kendileri Qt MVC ile ilgisi yok.
Mantığı nereye koyduk ? Kaynak modellerden (değiştiklerinde) verileri okuyarak ve sonuçları hedef modellere yazarak veriler üzerinde gerçek hesaplamaları yapan sınıflar oluşturduk. Qt'nin bakış açısından, bu mantık sınıfları, modellere "bağlandıklarından" (kullanıcı için "görünüm" değil, uygulamanın iş mantığı bölümü için bir "görünüm") olduğundan görünümler olacaktır.
Denetleyiciler nerede ? Orijinal MVC terminolojisinde, kontrolörler kullanıcı girişini (fare ve klavye) yorumlar ve istenen eylemi gerçekleştirmek için modele komutlar verir. Qt görünümleri, öğeleri yeniden adlandırmak ve taşımak gibi kullanıcı girdilerini zaten yorumladığından, buna gerek yoktu. Ancak ihtiyacımız olan şey, Qt görüşlerinin ötesine geçen bir kullanıcı etkileşimi yorumuydu.