2011-06-21 9 views
7

QGraphicsItem ve QGraphicsScene sınıflarından türettim. Öğelerin scene() öğesini çağırabilmesini ve bir QGraphicsItem * yerine derviedGraphicsItem * almasını istiyorum, dolayısıyla türetilmiş bir işaretçiyi döndürmek için QGraphicsScene :: itemAt öğesini yeniden yapılandırdım.QT: qobject_cast ile sorun

DerivedItem* DerivedScene::itemAt(const QPointF &position, const QTransform &dt) const 
{ 
    return qobject_cast< DerivedItem * >(
      QGraphicsScene::itemAt(position, dt)); 
} 

Ben o zaman QObject miras değil QGraphicsItem fark

scene.cpp: In member function ‘DerivedItem* DerivedScene::itemAt(qreal, qreal, const QTransform&) const’: 
scene.cpp:28: error: no matching function for call to ‘qobject_cast(QGraphicsItem*)’ 

(Ubuntut 10.4 Qt 4.6, GCC 4.4.3) aşağıdaki hatayı alıyorum, bu yüzden benim türetilmiş QGraphicsItem sınıfı birden sahip yapılan QObject ve QGraphicsItem öğesinden devralma ve Q_OBJECT makrosunu ekledikten ve projeyi yeniden oluşturduktan sonra aynı hatayı alıyorum.

Bunu yanlış yoldan mı yapıyorum? Ebeveyn sınıfını çocukken yapmaya çalışmak için kötü bir tasarım olması gerektiğini biliyorum, ancak bu durumda istediğim gibi görünüyor, çünkü türetilmiş öğe sınıfım yeni bir işleve sahip ve nesnelerinin bu yeni işlevselliği çağırmak için bir yola ihtiyacı var. itemAt() öğesi ile nesnelerin etrafındaki nesneler sorulur ve en iyi yol gibi görünüyor - ama doğru tipte bir işaretçiyi döndürmek için itemAt() öğesine ihtiyacım var. QGraphicsItem * dynamic_cast kullanarak QGraphicsScene :: itemAt() tarafından döndürülen dökme ben türetilmiş öğeleri alarak bu sorunun üstesinden gelebilirsiniz ama bu qobject_cast çalışıyor ve neden ben gerçekten anlamıyorum, ya kullanarak dynamic_cast vs qobject_cast için yararları ya da dezavantajları .

DÜZENLEME: Ben de QGraphicsItem ::

DerivedScene* DerivedItem::scene() const 
{ 
    return qobject_cast< DerivedScene * >(QGraphicsItem::scene()); 
} 

ama bu görünmüyor gibi bir DerivedScene * dönmek benim türetilmiş sınıftaki sahne(), yazım hatasına neden olmak reimplemented belirtmeyi unutmuşum ...

cevap

15

sadece döküm için QObject devralan hiçbir anlamı yoktur. Dinamik döküm üzerinde qobject_cast avantajı qobject_cast documentation hemen hemen özetleniyor: o RTTI destek gerektirmediğini avantajları ile,() fonksiyonu standart C++ dynamic_cast (benzer şekilde davranır)

qobject_cast ve Dinamik kütüphane sınırlarında çalışır. Eğer QObject gelen bütün istediğim eğer

O QObject devralmak değer Eğer QObjects varsa olması güzel ve kullanışlı bir yöntem olmakla değil.

Ayrıca QGraphicsIems için tam olarak :)

+1

Vay, sadece her türetilmiş grafik öğenin türünü() reimplemented ... o cevapsız ve ile qgraphicsitem_cast qobject_cast yerini inanamıyorum ve biz iş başındayız. Teşekkürler! – weevilo

1

istediğini Sen() qobject_cast bir QObject işaretçisi geçmek zorunda ve QGraphicsScene :: itemAt bir QGraphicsItem gösterici ile döner yapmalıyım qgraphicsitem_cast vardır. Bahsettiğiniz gibi QGraphicsItem, QObject'ten türemediğinden, derleyici size bu hatayı verdi.

+0

Neden yapmaya çalıştığımın aptalca olduğunu anlıyorum, ancak türetilmiş öğelerimi QObject'den devraldıktan sonra neden hala çalışmayı başaramadığını anlamak istiyorum. Çünkü temel sınıfları QObject'den de (bu durumda QGraphicsItem) türetilmiş olmalıdır. – weevilo

+0

Bir derleyici hatası alıyordunuz, çünkü yanlış türde bir şeyi işleve aktarıyorsunuz. Derleyici, bu türü kabul eden bir işlev bulamadığını söyledi. Türetilmiş nesneniz doğru türde olsa da, işlev bu türden dönmez. –