2010-11-14 24 views
5

J'essaye d'implémenter drag'n'drop pour un QGraphicsScene. Voici les événements que j'ai surchargée:Accepter des gouttes sur un QGraphicsScene

void TargetScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event) { 
    bool acceptDrag = false; 
    const QMimeData* mime = event->mimeData(); 

    // Is an image present? 
    if (mime->hasImage()) { 
     QImage img = qvariant_cast<QImage>(mime->imageData()); 
     dragPix = QPixmap::fromImage(img); 
     acceptDrag = !dragPix.isNull(); 
    } 

    event->setAccepted(acceptDrag); 
} 

void TargetScene::dropEvent(QGraphicsSceneDragDropEvent *event) { 
    // Add dragged pixmap to scene 
    QGraphicsPixmapItem* newPix = this->addPixmap(dragPix); 
    newPix->setPos(event->pos().x(), event->pos().y()); 
} 

La scène ne sera pas encore accept drops. Je suppose que c'est parce que je ne peux pas faire setAcceptDrops(true) sur mon QGraphicsScene. Comment accepter les chutes sur une scène graphique?

Répondre

7

L'astuce consiste ici à ACCEPTER ÉGALEMENT l'événement dans QGraphicsScene :: dragMoveEvent()!

La raison en est l'implémentation par défaut qui ignore les événements glisser-déposer s'il n'y a pas d'élément sous la souris!

Se référer également à: http://www.qtcentre.org/threads/8022-QGraphicsScene-doesn-t-accept-Drops

Vive

+0

Si vous acceptez la baisse de '' dragEnterEvent() '' il suffit de remplacer juste '' dragMoveEvent() '' une fonction vide, de façon pour éviter le comportement par défaut de QGraphicsScene. – jcoffland