QGraphicsItem および QGraphicsScene クラスを派生させました。アイテムが Scene() を呼び出して、QGraphicsItem * の代わりに derviedGraphicsItem * を取得できるようにしたいので、QGraphicsScene::itemAt を再実装して、派生ポインターを返します。
DerivedItem* DerivedScene::itemAt( const QPointF &position, const QTransform &dt ) const
{
return qobject_cast< DerivedItem * >(
QGraphicsScene::itemAt(position, dt) );
}
次のエラーが表示されます (Qt 4.6、Ubuntut 10.4 の GCC 4.4.3)
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*)’
次に、QGraphicsItem が QObject を継承していないことに気付いたので、派生した QGraphicsItem クラスに QObject と QGraphicsItem から複数の継承を持たせ、Q_OBJECT マクロを追加してプロジェクトを再構築した後、同じエラーが発生します。
私はこれについて間違った方法で進んでいますか?親クラスを子としてキャストしようとするのは悪い設計であることはわかっていますが、この場合は、派生アイテム クラスに新しい機能があり、そのオブジェクトがその新しい機能を呼び出す方法を必要とするため、私が望むように思えます。 itemAt() を使用してアイテムのシーン オブジェクトを要求するのが最善の方法のように思えますが、正しい型のポインターを返すには itemAt() が必要です。QGraphicsScene::itemAt() によって返された QGraphicsItem * を dynamic_cast を使用して派生アイテムにキャストさせることで、これを回避できますが、なぜそれが機能し、qobject_cast が機能しないのか、または dynamic_cast と qobject_cast を使用する利点または欠点がよくわかりません。 .
編集:派生クラスで QGraphicsItem::scene() を再実装して DerivedScene * を返すことを忘れていました。
DerivedScene* DerivedItem::scene() const
{
return qobject_cast< DerivedScene * >( QGraphicsItem::scene() );
}
しかし、これはコンパイルエラーを引き起こしているようには見えません...