gpt4 book ai didi

QT:qobject_cast 问题

转载 作者:行者123 更新时间:2023-12-04 10:05:32 25 4
gpt4 key购买 nike

我已经派生了 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,Ubuntut 10.4 上的 GCC 4.4.3)
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() 来返回正确类型的指针。我可以通过使用 dynamic_cast 让派生项转换 QGraphicsScene::itemAt() 返回的 QGraphicsItem * 来解决这个问题,但我真的不明白为什么这样做而不是 qobject_cast,或者使用 dynamic_cast 与 qobject_cast 的优缺点.

编辑:
忘了提到我还在派生类中重新实现了 QGraphicsItem::scene() 以返回一个 DerivedScene *,如
DerivedScene* DerivedItem::scene() const
{
return qobject_cast< DerivedScene * >( QGraphicsItem::scene() );
}

但这似乎不会导致编译错误...

最佳答案

仅仅为了转换而从 QObject 继承是没有意义的。 qobject_cast 的优势
qobject_cast documentation 中几乎总结了动态转换。 :

The qobject_cast() function behaves similarly to the standard C++ dynamic_cast(), with the advantages that it doesn't require RTTI support and it works across dynamic library boundaries.



如果你有 QObjects,那么拥有它是很好的并且很有用,但如果你想要从 QObject 继承 QObject,那么不值得从 QObject 继承。

此外,对于 QGraphicsIems,还有 qgraphicsitem_cast ,这应该完全符合您的要求:)

关于QT:qobject_cast 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com