He derivado las clases QGraphicsItem y QGraphicsScene. Quiero que los elementos puedan llamar a scene() y obtener derviedGraphicsItem * en lugar de QGraphicsItem *, así que reimplementó QGraphicsScene :: itemAt para devolver un puntero derivado.QT: problema con qobject_cast
DerivedItem* DerivedScene::itemAt(const QPointF &position, const QTransform &dt) const
{
return qobject_cast< DerivedItem * >(
QGraphicsScene::itemAt(position, dt));
}
me sale el siguiente error (Qt 4.6, GCC 4.4.3 en Ubuntut 10,4)
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*)’
luego me di QGraphicsItem no hereda QObject, así que hice mi clase derivada QGraphicsItem tener múltiples herencia de QObject y QGraphicsItem, y después de agregar la macro Q_OBJECT y reconstruir el proyecto obtengo el mismo error.
¿Voy por esto de la manera incorrecta? Sé que se supone que es un mal diseño intentar lanzar una clase padre como un niño, pero en este caso parece lo que quiero, ya que mi clase de elemento derivado tiene una nueva funcionalidad y sus objetos necesitan una forma de llamar a esa nueva funcionalidad en elementos alrededor de ellos mismos, y preguntando a los objetos de escena de elementos con itemAt() parece la mejor manera, pero necesito itemAt() para devolver un puntero del tipo correcto. Puedo evitar esto haciendo que los elementos derivados emitan QGraphicsItem * devuelto por QGraphicsScene :: itemAt() usando dynamic_cast, pero realmente no entiendo por qué funciona y no qobject_cast, o los beneficios o desventajas de usar dynamic_cast vs. qobject_cast .
EDIT: olvidó mencionar que también Reimplementado QGraphicsItem :: escena() en mi clase derivada para devolver un DerivedScene *, como
DerivedScene* DerivedItem::scene() const
{
return qobject_cast< DerivedScene * >(QGraphicsItem::scene());
}
pero esto no parece ser la causa de un error de compilación ...
Guau, no puedo creer que haya echado de menos ... solo el tipo reimplementado() para cada elemento gráfico derivado y reemplazado qobject_cast con qgraphicsitem_cast y estamos en el negocio. ¡Gracias! –
weevilo