2011-08-08 17 views
3

itemChangeの関数では、まず、追加される子アイテムを取得し、dynamic_castを 'MyItem'にキャストしますが、キャストは常に失敗します。QGraphicsItemの 'itemChange()'に関する質問

QVariant MyItem::itemChange (GraphicsItemChange change, const QVariant & value) 
{ 

if (change==ItemChildAddedChange) 
{ 
    QGraphicsItem* item=value.value<QGraphicsItem*>(); 
if (item) 
{ 
    MyItem* myItem=dynamic_cast<MyItem*>(item);//myItem always be NULL, 
//although I know the item is 'MyItem' type. 
    if (myItem) 
     { 
     qDebug()<<"successful!"; 
     } 
     } 
} 
return QGraphicsItem::itemChange(change,value); 
} 

ありがとうございました!

答えて

3

itemChangeにコメント使用してみてください:この 通知が送信されたときに、新しい子が完全に構築されていない可能性があることを

注意を。子に純粋な仮想関数を呼び出すと、 がクラッシュする可能性があります。

dynamic_castオブジェクトが完全に構築されていない場合も失敗する可能性があります。 (私はかなりこの上の仕様を理解していないが、それはなり、いくつかの場所、それはないだろう場合がある。)あなたがアイテムを構築後に親を設定した場合、それは動作します:

#include <QtGui> 

class MyGraphicsItem : public QGraphicsRectItem { 
public: 
    MyGraphicsItem(QGraphicsItem *parent, QGraphicsScene *scene) 
    : QGraphicsRectItem(0.0, 0.0, 200.0, 200.0, parent, scene) { 
    setBrush(QBrush(Qt::red)); 
    } 
protected: 
    QVariant itemChange(GraphicsItemChange change, const QVariant &value) { 
    if (change == QGraphicsItem::ItemChildAddedChange) { 
     QGraphicsItem* item = value.value<QGraphicsItem*>(); 
     if (item) { 
     MyGraphicsItem* my_item=dynamic_cast<MyGraphicsItem*>(item); 
     if (my_item) { 
      qDebug() << "successful!"; 
     } 
     } 
    } 
    return QGraphicsRectItem::itemChange(change, value); 
    } 
}; 

int main(int argc, char **argv) { 
    QApplication app(argc, argv); 

    QGraphicsScene scene; 
    MyGraphicsItem *item = new MyGraphicsItem(NULL, &scene); 

    // This will work. 
    MyGraphicsItem *item2 = new MyGraphicsItem(NULL, &scene); 
    item2->setParentItem(item); 

// // This will not work. 
// MyGraphicsItem *item2 = new MyGraphicsItem(item, &scene); 

    QGraphicsView view; 
    view.setScene(&scene); 
    view.show(); 

    return app.exec(); 
} 
+1

ありがとう!あなたは正しいです、それはコンストラクタで 'dynamic_cast'を使用するために失敗しました.. [リンク](http://stackoverflow.com/questions/6299266/dynamic-cast-of-this-inside-constructor)。 'itemChange'はQGraphicsItemのコンストラクタで呼び出され、その時間まで 'Myitem'は形成されていないので、失敗します。 – jnblue

0
+0

私はそれを試しても違いはありませんでした。 –

+0

例に示すように、クラスのUserTypeを定義しましたか? –

+0

ありがとうございます、私は 'qgraphicsitem_cast'を使ってテストしましたが、失敗しました。 'qgraphicsitem_cast'によって使用される 'type()'関数は 'virtual'なので、qdocによると、 'ItemChildAddChange'と 'ItemChildRemovedChange'の 'virtual'関数を使うのは間違っています。 Daveの答えは正しいことです。とにかくありがとうございます。 – jnblue