2010-07-06 17 views
14

Bir harita uygulamasında çalışıyorum ve veri nesnelerini bir tablo, bir form ve grafik nesneleri olarak haritada görüntülemem gerekiyor. PyQt kullanıyorum, ama bu bir Python sorusu değil bir Qt sorusu olduğu için bu gerçekten önemli değil.Qt Modeli/Görünüm çerçevesini Grafik Görünümü çerçevesiyle nasıl kullanırım?

Sadece tabloya ihtiyacım vardı ve görünümler oluşturursam bu kolay olurdu, sadece Qt Model/View çerçevesini kullanırdım. Bununla birlikte, veri görünümü olarak hareket eden QGraphicsScene ile esasen kendi Model/View çerçevesine sahip olan Grafik Görünümü çerçevesini kullanarak gerçekten kullanılabilir olan işlevselliği sağlamak için harita görünümüne ihtiyacım var.

Bunu yapmanın iki yolunu düşünebilirim. Bir QAbstractItemModel alt sınıfından bir yetkili modele başlamak, QAbstractItemView alt sınıfına bağlamak ve oradan QGraphicsItems'i sahnede oluşturmak ve güncellemek olacaktır. Bu çirkin görünüyor, ancak QGraphicsItems ile etkileşim olsa da, kullanıcı etkileşimini nasıl ele alacağından ve veri öğelerinde değişiklik yapamayacağından emin değilim.

Bunu yapmanın başka bir yolu da QGraphicsScene ürününü, her QGraphicsItem'in .data() özelliğinde veri nesnesini depolayan yetkili veri kaynağı olarak ele almaktır. Daha sonra QAbstractItemModel alt sınıfını yerleştirir ve veri deposundaki veriye erişebilmeleri için yazabilirim, böylece diğer görünümler bunu model olarak kullanır. Yine de sahnedeki verilere yapılan değişiklikleri, modele kadar nasıl çoğaltırım?

Hangi yaklaşımı kullanırsam, çerçeveler tarafından ele alınmayan bir boşluk var gibi görünüyor. Model/Görüntüle'de modelde tüm değişikliklerin yapıldığı varsayılmaktadır. Grafik Görünümü'nde tüm değişikliklerin sahnede yapıldığı varsayılır.

Hangi yaklaşımı QAbstractItemModel (yetkili) -> QAbstractItemView-> QGraphicsScene veya alternatif olarak QGraphicsScene (yetkili) -> QAbstractItemModel-> Diğer Görünümleri seçmelisiniz. Neden diğeri üzerinde birini seçtin ve ne tür çekler bekliyorsun? Qt'nin ikiz model/görüş çerçeveleri arasındaki bu boşluğu kapatması için başka kimseye ihtiyaç duydu ve bunu nasıl yaptınız?

cevap

10

QAbstractItemModel (yetkili) -> QAbstractItemView-> QGraphicsScene

Hiç şüphesiz. Bunu daha önce yapmıştım, biraz çoğaltma gerektiriyor (en azından bazılarını engelleyemedim) ama hiçbir şey çok kötü değil.

Bu aynı zamanda verilerinizi standart görünümlerde oldukça güzel olan manzarayla birlikte temsil etmenizi sağlar.

Benim en iyi tavsiye QGraphicsItem için QPersistantModelIndex bir QHash ve oluşturduğunuz QAbstractItemView bir QGraphicsScene saklamak olacaktır. Bu, Model/Görüş alanı (QModelIndex) ile Grafik Görünümü alanı (QGraphicsItem)

+0

arasında hızla geçiş yapmanıza olanak tanır. Bu, başladığım yaklaşımdır, fark etmeden önce bunu başka bir şekilde yapabilirim. AQbstractItemView alt sınıf için gereken tek yöntemleri dataChanged(), rowsInserted() ve satırAboutToBeRemoved() olduğunu tahmin ediyorum? Daha sonra sahnedeki öğeleri uygun şekilde yönetin. QGraphicsItems'de QPersistentModelIndexes depolayacağını umuyorum. QHash fikrini beğeniyorum. PyQT kullanıyorum, bu yüzden bir Python sözlüğü kullanacağım, ama her iki şekilde de güzel bir optimizasyon. –

+0

@Simon: Evet, bunu aldığınızı düşünüyorum, dataChanged() 'da, verilerinize ve temsiliyetinize bağlı olarak QGraphicsScene'den bazı kodları çoğaltmanız gerekebilir, ancak yine de küçük olması gerekir. –

+0

Temel düzeyde çalışıyor. Yuppi! –