QT: проблема с qobject_cast

Я унаследовал классы 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() );
}

, но это не вызывает ошибки компиляции ...

7
задан weevilo 21 June 2011 в 20:13
поделиться