QGraphics und Events

Alles rund um die Programmierung mit Qt
Antworten
Schmatze
Beiträge: 3
Registriert: 1. August 2010 18:39

QGraphics und Events

Beitrag von Schmatze »

Hi,

ich bin langsam am verzweifeln. Ich versuche mich momentan an QGraphics. Ich habe ein QGraphicsView mit einer QGraphicsScene und darin enthalten sind drei QGraphicsObject. Eins davon hat wiederum ein QGraphicsObject als child. Alles wird so angezeigt wie ich das möchte, auch wenn der Code momentan sehr wirr aussieht.

Nun möchte ich, dass das letzte QGraphicsObject events bearbeitet. Nur wie stelle ich das an? Testweise habe ich ein hoverEnterEvent implementiert, doch dieses wird nie aufgerufen.

Im Konstruktor steht setAcceptHoverEvents( true );

Ebenfalls habe ich das Flag QGraphicsItem::ItemIsMovable aktiviert, wodurch sich das Objekt bewegen lässt. Zwar doppelt so schnell wie ich die Maus bewege, aber eins nach dem anderen...

Müssen die parents des Objektes die Events irgendwie durchreichen? Oder was habe ich vergessen?

Danke schonmal.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Bitte poste Code (umsonst hat Gott uns nicht die Code-Tags erfinden lassen...), es ist so nicht ersichtlich, was du machst, wie du es machst und vor allem wo :P
Alles wird so angezeigt wie ich das möchte, auch wenn der Code momentan sehr wirr aussieht.
Die zweite Satzhälfte mach mir Sorgen.
Versuch das ganze etwas zu entwirren, extrahier es am besten in ein eigenes kleines Projekt, in dem du versuchst, nur dein eines Feature zu realisieren, und den ganzen anderen Logik-Blähbauch weglässt.
Wenn alle Gürtel, äh Stricke reißen, kannst du dein minimales, kompilierbares Beispiel OHNE BINARIES in ein zip packen und hier als Attachment (->Forensoftware-Feature, bitte nicht rapidshare &co) anhängen, dann können wir das eher sezieren.
Schmatze
Beiträge: 3
Registriert: 1. August 2010 18:39

Beitrag von Schmatze »

Ok, ich habe das jetzt ein wenig vereinfacht. Das Projekt besteht nur noch aus einem view, einem scene und einem item ( plus svg-renderer ). Meine zwei Probleme bestehen weiterhin. Ich habe den Code mal angehängt.

P.S. Warum ist die Endung bz verboten?
Dateianhänge
testprojekt.tar.gz
(39.17 KiB) 47-mal heruntergeladen
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Du solltest dich nochmal mit den Koordinatensystemen im Qt Graphics View Framework beschäftigen :P
Malen und boundingRect sind in Item-Koordinaten! Du malst von (0,0) weg, das boundingRect bezieht sich auf (0,0). Du kannst natürlich auch alles andere nehmen (z.B. wenn du die Items zentriert um den Ursprung (0,0) ausrichten/ansprechen willst. Aber NIEMALS pos() als Urpsprung nehmen, der bezieht sich auf die scene und NUR auf die scene :P

Somit haben wir folgende Änderungen:

Code: Alles auswählen

QRectF shipItem::boundingRect() const
{
    return QRectF(0,0,40,240);
}

void shipItem::paint( QPainter * painter, const QStyleOptionGraphicsItem* opt, QWidget* w)
{
    QPixmap m_shipPixmap = projectRenderer::self()->shipPixmap( QSize( 40, 240 ), 0 ); // 0 = dreadnought

    painter->drawPixmap( 0, 0, m_shipPixmap );

    Q_UNUSED(opt);
    Q_UNUSED(w);
}
Und die Sache mit dem hoverEnterEvent ist ein böööööser Lesefehler :P
Der Typ für den Event-Parameter heißt nicht "QGraphicsSceneMouseEvent" sondern "QGraphicsSceneHoverEvent" ;)
Schmatze
Beiträge: 3
Registriert: 1. August 2010 18:39

Beitrag von Schmatze »

Ach herje ...

Manchmal braucht man nur einen (oder hier zwei ;-) ) kleine(n) Schupser in die richtige Richtung. Danke für die Hilfe, jetzt funktionierts.
Antworten