私はQGraphicsItemクラスとQGraphicsSceneクラスを派生させました。アイテムをscene()を呼び出してQGraphicsItem *の代わりにderviedGraphicsItem *を取得できるようにするため、QGraphicsScene :: itemAtを再実装して派生ポインタを返すようにします。QT:qobject_castの問題
DerivedItem* DerivedScene::itemAt(const QPointF &position, const QTransform &dt) const
{
return qobject_cast< DerivedItem * >(
QGraphicsScene::itemAt(position, dt));
}
は、私はその後、QObjectを継承しませんQGraphicsItem気づい
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を)次のエラーを取得するので、私は私の派生QGraphicsItemクラスが複数持って作られましたQObjectとQGraphicsItemから継承し、Q_OBJECTマクロを追加してプロジェクトを再構築した後も同じエラーが発生します。
私はこれについて間違った方法をしていますか?親クラスを子としてキャストしようとするとデザインが悪いはずですが、この場合は、派生したアイテムクラスに新しい機能があり、そのオブジェクトに新しい機能を呼び出す方法が必要なので、 itemAt()を使ってアイテムシーンオブジェクトに質問するのが最善の方法だと思われますが、正しいタイプのポインタを返すにはitemAt()が必要です。私はこれを回避するために、QGraphicsItem *をQGraphicsScene :: itemAt()がdynamic_castを使用して返したものをキャストすることでこの問題を回避することができますが、なぜ動作してqobject_castでないのか、またはdynamic_castとqobject_castを使用するメリットまたはデメリット。
EDIT: は
DerivedScene* DerivedItem::scene() const
{
return qobject_cast< DerivedScene * >(QGraphicsItem::scene());
}
として、DerivedScene *を返すために、私の派生クラスでのシーン()::私もQGraphicsItemを再実装することを言及するのを忘れてしまったが、これはコンパイルエラーを引き起こしていると思われません...
私はそれを逃したとは思えません...それぞれの派生グラフィックスアイテムに対してtype()を再実装し、qgjecticscastをに置き換えました。ありがとう! –
weevilo