eventFilter will nicht

Alles rund um die Programmierung mit Qt
Antworten
goeck
Beiträge: 6
Registriert: 23. Oktober 2009 14:09

eventFilter will nicht

Beitrag 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
Zuletzt geändert von goeck am 29. Oktober 2009 08:58, insgesamt 1-mal geändert.
goeck
Beiträge: 6
Registriert: 23. Oktober 2009 14:09

Beitrag 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!
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Re: eventFilter will nicht

Beitrag 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
goeck
Beiträge: 6
Registriert: 23. Oktober 2009 14:09

Beitrag 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
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag 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
goeck
Beiträge: 6
Registriert: 23. Oktober 2009 14:09

Beitrag 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?
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag 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
Antworten