Seite 1 von 1

eventFilter will nicht

Verfasst: 28. Oktober 2009 10:29
von goeck
Hallo Leute,

ich habe eine Frage zu eventFiltern. In meinem Programm habe ich eine QGraphicsScene und dort zwei von QGraphicsItem abgeleitete Elemente reingesetzt. Eins ist von der Klasse BackgroundRect und eines von der Klasse ColorItem, die beide von QGraphicsItem abgeleitet sind wiegesagt. Ich habe schon EventHandler reimplementiert (mouseMoVeEvent, etc. ) und das funktioniert hervorragend.
Jetzt wollt ich, dass die Mouse Events auf ColorItem vorher von BackgroundRect gefiltert werden und deshalb in BackgroundRect eine Funktion

Code: Alles auswählen

bool BackgroundRect::eventFilter(QObject* target, QEvent* event)
{
    if(event->type() == QEvent::MouseMove)
    {
        if(this->widthVal <= 100)
        {
//            this->hide();
            return true;
        }
        else
            return false;
    }
    return false;
}
hinzugefügt. Von beiden Klassen werden Instanzen (ColorItem: item; BackgroundRect: rectA) in eine anderen dritten Klasse gebildet. In dieser habe ich dann

Code: Alles auswählen

item->installEventFilter(rectA);
geschrieben.

Leider passiert rein gar nichts und über Debuggen finde ich heraus, dass ich nie in den EventFilter gelange.

Was mache ich falsch? Nach allen Dokus, die ich bisher dazu gelesen habe ist das doch alles, was ich benötige oder...

Danke für eure Hilfe
Grüße Stefan

Verfasst: 28. Oktober 2009 16:25
von goeck
Kann sich denn nicht jemand meiner erbarmen, bitte? Ich sitze auf dem Trockenen solang ich keine weiteren Anstätze für den Event Filter habe.

Danke!

Re: eventFilter will nicht

Verfasst: 29. Oktober 2009 08:45
von neuschi
goeck hat geschrieben:

Code: Alles auswählen

bool BackgroundRect::eventFilter(QObject* target, QEvent* event)
 ....
}

Leider passiert rein gar nichts und über Debuggen finde ich heraus, dass ich nie in den EventFilter gelange.
Was mache ich falsch? Nach allen Dokus, die ich bisher dazu gelesen habe ist das doch alles, was ich benötige oder...
QGraphicsItem ist kein QObject, hat daher auch keine "eventFilter" Methode.
Was du suchst ist

Code: Alles auswählen

bool QGraphicsItem::sceneEventFilter ( QGraphicsItem * watched, QEvent * event )
\Ralf

Verfasst: 29. Oktober 2009 09:16
von goeck
Hallo,

nachdem ich den Code nun entspr. geändert habe und den EventFilter richtig installiert habe, komme ich in den EventFilter hinein im Debug Modus. javascript:emoticon(':D') Jetzt muss ich noch etwas an der Event Verarbeitung an sich feilen. Vielen Dank für den Hinweis, obwohl mich das wundert, denn ich hatte beide Klassen auch von QObject abgeleitet.

Hier soweit mein betreffender Code:
1. Header File

Code: Alles auswählen

 class BackgroundRect :  public QObject, public QGraphicsItem
 {
     Q_OBJECT
     ...

    protected:         
         void mousePressEvent (QGraphicsSceneMouseEvent * event );
         void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event);    
         bool sceneEventFilter( QGraphicsItem * watched, QEvent * event );
 };
2. CPP Datei

Code: Alles auswählen

bool BackgroundRect::sceneEventFilter( QGraphicsItem * watched, QEvent * event )
{
//    if(event->type() == QEvent::MouseMove)
//    {
        if(this->widthVal <= 100)
            return true;
        return false;
//    }
//    return false;
}
Und noch die Installierung des Filters in der CPP Datei in der beide Instanzen meiner abgeleiteten Klassen erzeugt werden.

Code: Alles auswählen

item->installSceneEventFilter(rectA);
Was noch nicht klappt ist die Erkennung auf den Typ des Events. Muss ich mir nochmal die Typen anschauen.

Vielen Dank soweit :D

Verfasst: 29. Oktober 2009 09:36
von neuschi
goeck hat geschrieben:
Vielen Dank für den Hinweis, obwohl mich das wundert, denn ich hatte beide Klassen auch von QObject abgeleitet.
Auch das Ableiten von QObject hilft nicht, da du für die mouseEvents mindestens ein QWidget brauchst. Items sind nun mal keine Widgets.


Was noch nicht klappt ist die Erkennung auf den Typ des Events. Muss ich mir nochmal die Typen anschauen.

Code: Alles auswählen

    if(event->type() == QEvent::MouseMove)
Versuchs mal mit

Code: Alles auswählen

if(event->type() == QEvent::GraphicsSceneMouseMove )
Übrigens, von Qt 4.6 an gibt es ein QGraphicsObject, (Item + QObject).

\Ralf

Verfasst: 29. Oktober 2009 09:41
von goeck
Versuchs mal mit

Code: Alles auswählen

if(event->type() == QEvent::GraphicsSceneMouseMove )
Genau das habe ich grade schon gemacht und funktioniert einwandfrei. Findet man ja schnell beim Durchsuchen der Doku nach den EventTypes.
Übrigens, von Qt 4.6 an gibt es ein QGraphicsObject, (Item + QObject).
Ach das ist ja klasse, dann gibts ja auch das AnimationFramework integriert,worauf ich auch schon scharf bin ;-) Weiß man wann 4.6 offiziell rauskommt?

Verfasst: 29. Oktober 2009 10:50
von neuschi
goeck hat geschrieben:
Ach das ist ja klasse, dann gibts ja auch das AnimationFramework integriert,worauf ich auch schon scharf bin ;-) Weiß man wann 4.6 offiziell rauskommt?
Die Beta ist vorletzte Woche rausgekommen, d.h. man darf damit rechnen, dass die finale Version im 1. Quartal 2010 fertig ist.

\Ralf