Я унаследовал классы QGraphicsItem и QGraphicsScene. Я хочу, чтобы элементы могли вызывать сцену () и получать derviedGraphicsItem * вместо QGraphicsItem *, поэтому я повторно реализовал QGraphicsScene :: itemAt, чтобы вернуть производный указатель.
DerivedItem* DerivedScene::itemAt( const QPointF &position, const QTransform &dt ) const
{
return qobject_cast< DerivedItem * >(
QGraphicsScene::itemAt(position, dt) );
}
Я получаю следующую ошибку (Qt 4.6, GCC 4.4 .3 в 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*)’
Затем я заметил, что QGraphicsItem не наследует QObject, поэтому я сделал мой производный класс QGraphicsItem множественным наследованием от QObject и QGraphicsItem, и после добавления макроса Q_OBJECT и перестройки проекта я получаю ту же ошибку.
Я ошибаюсь? Я знаю, что попытка преобразовать родительский класс в дочерний - плохой дизайн, но в данном случае это похоже на то, что я хочу, поскольку у моего производного класса элемента есть новые функции, а его объектам нужен способ вызвать эту новую функцию элементы вокруг себя, и запрос объекта сцены элементов с помощью itemAt () кажется лучшим способом, но мне нужно, чтобы itemAt () возвращал указатель правильного типа. Я могу обойти это, если производные элементы приведут QGraphicsItem *, возвращаемое QGraphicsScene :: itemAt (), с использованием dynamic_cast, но я действительно не понимаю, почему это работает, а не qobject_cast, или преимущества или недостатки использования dynamic_cast по сравнению с qobject_cast .
РЕДАКТИРОВАТЬ: забыл упомянуть, что я также повторно реализовал QGraphicsItem :: scene () в своем производном классе, чтобы вернуть DerivedScene *, как
DerivedScene* DerivedItem::scene() const
{
return qobject_cast< DerivedScene * >( QGraphicsItem::scene() );
}
, но это не вызывает ошибки компиляции ...