簡體   English   中英

QT:qobject_cast出現問題

[英]QT: trouble with qobject_cast

我派生了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,UCCntut 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優於動態強制轉換的優勢總結如下

qobject_cast()函數的行為類似於標准C ++ dynamic_cast(),其優點是不需要RTTI支持,並且它可以跨動態庫邊界工作。

如果你有QObjects,那么擁有和有用是很好的,但如果你想從QObject中獲取它,則不值得從QObject繼承。

另外,對於QGraphicsIems,有qgraphicsitem_cast ,它應該完全符合你的要求:)

您必須將QObject指針傳遞給qobject_cast(),QGraphicsScene :: itemAt返回一個QGraphicsItem指針。 因為,如你所提到的,QGraphicsItem不是從QObject派生的,編譯器給你的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM