Я получил классы QGraphicsItem и QGraphicsScene. Я хочу, чтобы элементы могли вызывать scene () и получать 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 .
EDIT:
забыл упомянуть, что я также переопределил QGraphicsItem :: scene () в своем производном классе, чтобы вернуть DerivedScene *, как
DerivedScene* DerivedItem::scene() const
{
return qobject_cast< DerivedScene * >( QGraphicsItem::scene() );
}
но, похоже, это не вызывает ошибку компиляции ...