2011-08-08 2 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'생성자에서 사용하기 때문에 실패했습니다 .. [link] (http://stackoverflow.com/questions/6299266/dynamic-cast-of-this-inside-constructor). QGraphicsItem의 생성자에서 'itemChange'가 호출되고 그 시간까지 'Myitem'이 형성 (생성)되지 않았으므로 실패합니다. – jnblue

0
+0

시도해 보니 별 차이가 없었습니다. –

+0

예제와 같이 클래스에 대한 UserType을 정의 했습니까? –

+0

답장을 보내 주셔서 감사합니다. 'qgraphicsitem_cast'를 사용하여 테스트했으며, 실패했습니다. 'qgraphicsitem_cast'에서 사용하는 'type()'함수가 '가상'이므로 qdoc에 따라 'ItemChildAddChange'및 'ItemChildRemovedChange'에서 '가상'함수를 사용하는 것은 잘못된 것입니다. Dave의 답변은 옳습니다. 어쨌든 대단히 감사합니다. – jnblue