2012-04-10 19 views
1

Ich habe eine benutzerdefinierte QGraphicsView und eine benutzerdefinierte QGraphicsItem. Ich möchte, dass das Element mit meinem Klick klickt, wenn ich in das Element klicke, ansonsten möchte ich, dass der Klick von der Ansicht gehandhabt wird.MousePressEvent in Ansicht und Elemente in Qt

Aber wenn ich auf das Element klicke, bearbeitet das Element den Klick. Das ist in Ordnung. Aber wenn ich irgendwo anders klicke, wird der Klick überhaupt nicht behandelt. Der gesamte Code in meinen Klassen, der etwas mit mouseEvents zu tun hat, ist unten.

class CustomView : public QGraphicsView 
{ 
    Q_OBJECT 

public: 

    void mousePressEvent(QGraphicsSceneMouseEvent *event); 

}; 

void CustomView::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in view"; 
} 

class CustomItem : public QGraphicsItem 
{ 
public: 
    CustomItem(CustomView* widget) 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 

CustomItem::CustomItem(CustomView* widget){ 
    setFlag(ItemIsSelectable); 
    setFlag(ItemIsMovable); 
} 

void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in item"; 
} 

Es scheint, dass, wenn ich die Funktion mouse von der CustomItem Klasse und Änderung der Custom die Funktion mouse zu entfernen:

void CustomView::mousePressEvent(QMouseEvent *event){ 
    cout << "pressing in view"; 
} 

die Custom kümmert sich um alle Mausevents.

Wie kann ich mit CustomItem die Klicks in den Elementen und mit CustomView alle anderen Klicks behandeln?

Vielen Dank.

class CustomView : public QGraphicsView 
{ 
    Q_OBJECT 

public: 

}; 

class CustomScene : public QGraphicsScene 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 


void CustomScene::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in scene"; 
} 

class CustomItem : public QGraphicsItem 
{ 
public: 
    CustomItem(CustomView* widget) 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 

CustomItem::CustomItem(CustomView* widget){ 
    setFlag(ItemIsSelectable); 
    setFlag(ItemIsMovable); 
} 

void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in item"; 
} 

A Klicken Sie in der Szene, aber von der Szene bekommen in einem Artikel behandelt nicht:

EDIT

So, jetzt habe ich es geändert. Aber Klicks in den Elementen werden nicht von den Elementen selbst gehandhabt, stattdessen werden sie von der Szene gehandhabt. Es sei denn, du klickst 2 mal richtig schnell auf die Items, es wird von der Szene und dem Item gehandhabt.

Irgendwelche Ideen?

+0

versuchen zwingende 'QGraphicsScene :: mouse (QGraphicsSceneMouseEvent * mouseevent)' Methode in QGraphicsScene, statt QGraphicsView – Kunal

+0

Ich denke, Ihre "CustomWidget :: mouse" soll "Custom :: mouse" (oder umgekehrt) sein. – Anthony

+0

@Kunal Ty für Ihre Eingabe, ich habe die mousePressEvent in die Szene bewegt, aber ich habe immer noch ein Problem damit – fibera

Antwort

4

QGraphicsView ist nicht wirklich ein guter Ort, um szenenspezifische Ereignisse zu behandeln. Stattdessen müssen Sie QGraphicsScene :: mousePressEvent überschreiben. Ich würde so etwas wie dies empfehlen:

void CustomScene::mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    if (itemAt(event) == NULL) 
    { 
    // do stuff if not clicked on an item 
    } 
    else 
    { 
    QGraphicsScene::mousePressEvent(event); // this forwards the event to the item 
    } 
} 

Beachten Sie, dass QGraphicsScene :: Itemat könnten Sie Schwierigkeiten geben, wenn Sie Einzelteile mit dem ItemIgnoresTransformations Flag auf true gesetzt haben. Suchen Sie in den Dokumenten für QGraphicsScene :: itemAt nach, wie Sie dies beheben können.

+0

Ok, also habe ich das QGraphicsView :: mousePressEvent (QGraphicsSceneMouseEvent) entfernt und diese Funktion dem benutzerdefinierten QGraphicsScene hinzugefügt. Wenn ich nun irgendwo auf einen Gegenstand klicke, wird der Klick von der Szene übernommen. Wenn ich auf einen Gegenstand klicke, wird der Klick auch von der Szene übernommen. Aber wenn ich 2 mal sehr schnell auf den Gegenstand klicke, handhaben der Gegenstand und die Szene meinen Klick. – fibera

+0

@fibera Ich erkannte einen Fehler, den ich in meiner Antwort gemacht habe. Probieren Sie die bearbeitete Antwort aus und lassen Sie mich wissen, wie es geht. – Anthony

+0

Das macht den Trick. Ty für deine Zeit und Geduld. – fibera