Seite 1 von 1

Drag and Drop eines QGraphicsItem in einer QGraphicsScene

Verfasst: 25. Mai 2007 11:01
von mathies
Hallo,

ich möchte in meiner Scene ein QGraphicItem per drag and drop bewegen, benötige aber zusätzliche Funktionallität in den MouseEvent-Funktionen, die ich deswegen überschreiben mußte (wenn ich die Funktionen nicht überschreibe funktioniert es ohne Probleme...).

Ich habe es folgendermaßen probiert. Ausschnitt MyScene.cpp:

Code: Alles auswählen

// Wenn nen Item an der Position des klicks, dann dies als GrabberItem setzen
void MyScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent)
{
    mGrabberItem = itemAt( mouseEvent->buttonDownScenePos(Qt::LeftButton) );
}

// GrabberItem für Qt-Funktionalität zurückgeben
QGraphicsItem* MapScene::mouseGrabberItem()
{
    return mGrabberItem;
}
Ausschnitt MyScene.h:

Code: Alles auswählen

protected:
    QGraphicsItem*    mGrabberItem;
private:
    QGraphicsItem*    mouseGrabberItem();
Es tut sich damit aber reichlich wenig. Das mGrabberItem wird nicht beachtet obwohl ich es doch eindeutig setze.

Wo liegt da das Problem?

Danke schon mal.

Grüßle,
Matthias

Verfasst: 25. Mai 2007 11:07
von macman
Du musst das mousePressEvent auch an die Basisklasse übergeben, sonst verwirfst Du es ja. Bist aber nicht der erste mit dem Problem hier.

Verfasst: 25. Mai 2007 14:27
von mathies
Hallo,

wie meinst Du das? MyScene ist von QGraphicsScene abgeleitet, also brauche ich doch da nix mehr übergeben.

Wenn ich was anderes in der MousePressEvent-Funktion mache funktioniert es doch (z.B. das markieren von Items etc.), wohin sollte ich da jetzt noch etwas übergeben? Wenn ich das richtig verstehe wird doch dann, wo auch immer das geschieht, das GrabberItem abgefragt und das habe ich doch gesetzt.

Grüßle,
Matthias

Verfasst: 25. Mai 2007 15:38
von neuschi
mathies hat geschrieben: MyScene ist von QGraphicsScene abgeleitet, also brauche ich doch da nix mehr übergeben.
Irrtum.

probiere mal folgendes:

Code: Alles auswählen

void MyScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent)
{
    mGrabberItem = itemAt( mouseEvent->buttonDownScenePos(Qt::LeftButton) );

    QGraphicsScene::mousePressEvent(mouseEvent);

}
 

Verfasst: 25. Mai 2007 15:46
von mathies
Danke, wie kommt da drauf? Ich dachte immer, dadurch, dass ich die andere Funktion überschreibe ist das gegessen :)

Grüßle,
Matthias

Verfasst: 25. Mai 2007 15:57
von franzf
Wenn du in deiner abgeleiteten Klasse eine Methode überschreibst, ist die Funktionalität der Basisklasse erst mal futsch! Um das alte Verhalten deiner neuen Version nicht zu unterbinden, kannst du wie gezeigt die "Original-Version" der Basisklasse aufrufen.