Seite 1 von 1
[gelöst]QGraphicsSceneMouseEvent "übergeben"
Verfasst: 4. Mai 2013 12:11
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.

ch 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
Re: QGraphicsSceneMouseEvent "übergeben"
Verfasst: 4. Mai 2013 17:35
von Christian81
Wenn die QGraphicsItems in der Szene sind und sie auch Events akzeptieren (siehe QGraphicsItem::GraphicsItemFlag) dann empfangen sie auch Klick-Events.
Re: QGraphicsSceneMouseEvent "übergeben"
Verfasst: 5. Mai 2013 17:26
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
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?
Re: QGraphicsSceneMouseEvent "übergeben"
Verfasst: 5. Mai 2013 20:28
von Christian81
Die Implementation von MyGSc bitte noch.
Re: QGraphicsSceneMouseEvent "übergeben"
Verfasst: 6. Mai 2013 17:36
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";
}
Re: QGraphicsSceneMouseEvent "übergeben"
Verfasst: 6. Mai 2013 19:47
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?
Re: QGraphicsSceneMouseEvent "übergeben"
Verfasst: 7. Mai 2013 17:16
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: