2012-03-13 20 views
6

Qt Model/View framework'ü hakkında okudum. Veritabanındaki tablolar gibi tablolanmış verilerle çalışmayı gerçekten yararlı buluyorum. Sorum şu: emlak listesi gibi olmayan tablo verileri için mi, yoksa çeşitli türde veri türleri için mi yararlı olacak? Eğer öyleyse, ona nasıl yaklaşmalıyım?Qt Modeli/Görünümü tablo içermeyen veriler ve tablo dışı/liste kullanıcı arayüzü ile mi kullanıyorsunuz?

gol verileri gibi bazı özellik listesi için bir editör ile gelip etmektir. Liste çalışma zamanında oluşturulmuştur ve öğeler çeşitli türlerden (sayı, dizi, boole ve dosya yollarından bazılarıdır) çeşitlidir. Her eleman temel olarak bir isim-değer çiftidir. Her eleman için isim, tür ve sınırlamalar (örneğin sınırlar) derleme zamanında tanımlanır. Kullanıcı girişine bağlı olarak çalışma zamanında farklı listelerde toplanacaklardır. Ve düzenleme listesi sırasında öğeler listesi değişebilir.

UI en olası kullanıcı girişine göre birleştirilmiş çeşitli önceden tasarlanmış aletler kombinasyonu olacaktır. Liste veya tablo görünümleri olmayabilir. Tasarım desenine veya örneklerine yönelik bazı işaretçiler de çok beğenilmektedir. Teşekkürler.

cevap

3

Bunu yapmak için QT'de MVC framework ile ilgili bir sorun görmüyorum. Temelde

standart bir tablo görünümü arasında fark

ve bu haritasında dinamik benzer bir liste oluşturmak şudur: Bir yapabilir

QMap<QString, QVariant> property_map; 

:

QList<std::pair<QString, QVariant>> property_list; 

hangi sonra can bir tabloda görüntülemek için kullanın.

struct { 
    QString prop_name; 
    int prop_type; 
    QVariant prop_value; 
}; 

QVariant

temelde veri depolama için tek bir soyutlama sınıfına sağlayacaktır ve bunu reimplementing olabilir QAbstractItemModeldata() işlevi tarafından iade edilen ne aslında: en iyi yolu muhtemelen olacaktır.

Yani temelde bir özellik listesini alıp veritabanı olarak verileri gibi aynı masaya aşağı kaynar.

tadil

size widget'ları aynı veya iyi tanımlanmış boyutta olmadıkça birden problem oldukça muhtemeldir diğer önceden tanımlanmış aletler ile doldurulur bu widget'ı olmasını istediğiniz bir Widget varsa.

Yapabilecekleriniz: Ekran widget'i, QGridLayout ya da diğer olası düzenler gibi bir düzen tanımlar ve ardından diğer widget'ları birtakım parametreler kullanarak ekleyebilir, ancak bir miktar acı çekebilir.

Yapabileceğiniz diğer bir yaklaşım, tüm özellik widget'larını ön tarafa ekranın UI'sine yerleştirmek ve sadece ihtiyacınız olanları ve geri kalanları açmaktır, ancak bu yalnızca iyi tanımlanmış sınırlı sayıda ön bilginiz varsa geçerlidir. -designed widget'lar.

+0

Cevap için teşekkürler. Ancak sorum, Qt Model View frameworkünü NON-table UI ile kullanmaktır. Düzenlerde oluşturulan ve düzenlenmiş widget'lar gibi. Yine de, varyant iyi bir fikirdir. –

2

şimdi oldukça zaman Modeli/Görünüm çerçevesini kullanıyorum ve ben genellikle Qt kaplarda (vektörler, liste, vb) dayalı bir arka uç ile kendi modellerini uygulamak. Veri bir veritabanından gelse bile, (ör.) Bir veritabanı kimlikleri vektörüyle çalışmak, performansı önemli ölçüde artırabilir (ve bazen yapabileceğiniz tek yoldur).

Qt dokümanlardan

This trivial example ("a Özel Model Oluşturma bakınız) başladığım ve özel bir model için bir arka uç olarak bir QStringList nasıl kullanılacağını gösteren noktadır.

Sonra size özel tanımlayabilirsiniz modelinizi tanımlı Alttaki modelin içeriğine göre düzenlenmiş widget'lar çizecek olan görünümler. Model değiştiğinde, görünümünüz gerekli olduğunda widget'leri yeniden düzenleyerek değişecektir. özelliklerinden yararlanarak her veri türü için uygun pencere öğesi oluşturmalısınız (örn. QStringList için bir QComboBox için bir QSpinBox, ve böylece bir ...)

+0

QVariant'ı işaretlediğiniz için teşekkür ederiz. Ama sorum şu: tablo olmayan veriler ve kullanıcı arayüzü ile çerçeveyi kullanmak. Üzgünüm, açıklığa kavuştum. –

+0

Tamam, ihtiyacınız olan şey, model/görünüm çerçevesine maruz kalan temel sınıfları türeterek kendi görüşlerinizi tanımlar. QAbstractItemView örneğini örnek olarak alın: Alt kısımdaki model içeriğine göre kaydırma alanında widget'lar oluşturabilirsiniz. – Masci

+0

cevabımı buna göre düzenledi – Masci