[gelöst]QGraphicsSceneMouseEvent "übergeben"

Alles rund um die Programmierung mit Qt
Antworten
ThunderStorm
Beiträge: 15
Registriert: 30. April 2013 15:52

[gelöst]QGraphicsSceneMouseEvent "übergeben"

Beitrag von ThunderStorm »

Hi,

Ich habe eine von QGraphicsScene abgeleitete Klasse, die die Mouse-Click und Mouse-Press Events auffangen soll. (Um dann z.B. etwas auf der QGraphicsScene zu zeichnen)
Das Problem ist, dass sich auf der QGraphicsScene auch QGraphicObject's befinden, die die Mouse-Events erhalten sollen, wenn auf die Objekte geklickt wird.
Das ist aber nicht der Fall, weil die GraphicsScene die Events sozusagen "abfängt" und nicht an das Objekt weitergibt, dass sich an dieser Stelle auf der QGraphicsScene befindet.

(Ich könnte jetzt zwar in der QGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event) Funktion für alle Objekte abfragen, ob sich eines an der "geklicken" Position befindet und dann das Event an das Objekt weitergeben, aber da sich auf der Scene relativ viele Objekte befinden, würde das vermutlich zuviel Leistung kosten. )

Weiß jemand, wie ich die Klassen erstellen muss, damit das funktioniert?

Mit freundlichen Grüßen,
ThunderStorm
Zuletzt geändert von ThunderStorm am 8. Mai 2013 17:01, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QGraphicsSceneMouseEvent "übergeben"

Beitrag von Christian81 »

Wenn die QGraphicsItems in der Szene sind und sie auch Events akzeptieren (siehe QGraphicsItem::GraphicsItemFlag) dann empfangen sie auch Klick-Events.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ThunderStorm
Beiträge: 15
Registriert: 30. April 2013 15:52

Re: QGraphicsSceneMouseEvent "übergeben"

Beitrag von ThunderStorm »

@Christian81:
Danke für deine Antwort, ich habe jetzt mal die Flag QGraphicsItem::ItemIsSelectable gesetzt, was aber auch nichts gebracht hat.
Die QGraphicsObjecte habe ich mit

Code: Alles auswählen

scene->addItem(ItemXY);
in die Szene gesetzt.

Meine von QGraphicsScene abgeleitete Klasse sieht so aus:

Code: Alles auswählen

#ifndef MYGSC_H
#define MYGSC_H

#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QDebug>

class MyGSc : public QGraphicsScene
{
    Q_OBJECT
public:
    explicit MyGSc(QObject *parent = 0);
    explicit MyGSc(qreal x, qreal y, qreal width, qreal height, QObject *parent = 0);

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
};

#endif // MYGSC_H
Und die Klasse des QGraphicsObject's sieht so aus (gekürzt):

Code: Alles auswählen

#ifndef BAC_H
#define ITEM_H

#include "mainwindow.h"
#include "mygsc.h"
#include <QGraphicsObject>

class Item : public QGraphicsObject
{
    Q_OBJECT
public:
    Item(MyGSc *parent, MainWindow *wnd);  //Default Konstuktor
    //Default Destruktor
    ~Item();
protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
};

#endif // ITEM_H
Im Konstruktor des QGraphicsObject's wird außerdem noch die Flag QGraphicsItem::ItemIsSelectable gesetzt.

Wenn ich mir mit qDebug() die Aufrufe der Funktionen anzeigen lasse, wird nur in MyGSc das Press bzw. Release Event ausgelöst, außer wenn ich schnell hintereinander Klicke (z.B. Doppelklick), dann wird auch die Press-Funktion vom QGraphicsObject aufgerufen, aber die Release-Funktion trotzdem nicht.

Weiß jemand, was ich da falsch gemacht habe?
Mit freundlichen Grüßen,
ThunderStorm
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QGraphicsSceneMouseEvent "übergeben"

Beitrag von Christian81 »

Die Implementation von MyGSc bitte noch.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ThunderStorm
Beiträge: 15
Registriert: 30. April 2013 15:52

Re: QGraphicsSceneMouseEvent "übergeben"

Beitrag von ThunderStorm »

Die Implementierung ist eigentlich Default, ohne Abänderungen, oder muss man da was ändern?

Code: Alles auswählen

#include "mygsc.h"

//Minimal-Konstruktor
MyGSc::MyGSc(QObject *parent) :
    QGraphicsScene(parent)
{

}
//Erweiterter Konstruktor
MyGSc::MyGSc(qreal x, qreal y, qreal width, qreal height, QObject *parent)
    : QGraphicsScene(x,y,width,height,parent)
{

}

//Mouse Press Event - Funktion
void MyGSc::mousePressEvent(QGraphicsSceneMouseEvent *event)
{

    qDebug()<<"Mouse Press Event in MyGSc";
}

//Mouse Release Event - Funktion
void MyGSc::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{

    qDebug()<<"Mouse Release Event in MyGSc";
}

Mit freundlichen Grüßen,
ThunderStorm
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QGraphicsSceneMouseEvent "übergeben"

Beitrag von Christian81 »

Wusste ich es doch. Wenn Du mousePress und mouseRelease reimplementierst und die Events nicht an die Basisklasse weitergibst wie soll die Basisklasse die Events dann an die Items weitergeben?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ThunderStorm
Beiträge: 15
Registriert: 30. April 2013 15:52

Re: QGraphicsSceneMouseEvent "übergeben"

Beitrag von ThunderStorm »

@Christian81:
Danke, jetzt funktionierts und ich habs verstanden, aber ich glaube, da wäre ich nie drauf gekommen.

An alle, die das gleiche Problem haben:
Man muss das Event an die Basisklasse übergeben, indem man explizit die Basisklassen-Funktion aufruft:

Code: Alles auswählen

QGraphicsScene::mouseReleaseEvent(event);
Mit freundlichen Grüßen,
ThunderStorm
Antworten