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.
QGraphics und Events
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
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.
Die zweite Satzhälfte mach mir Sorgen.Alles wird so angezeigt wie ich das möchte, auch wenn der Code momentan sehr wirr aussieht.
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.
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?
P.S. Warum ist die Endung bz verboten?
- Dateianhänge
-
- testprojekt.tar.gz
- (39.17 KiB) 46-mal heruntergeladen
Du solltest dich nochmal mit den Koordinatensystemen im Qt Graphics View Framework beschäftigen 
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
Somit haben wir folgende Änderungen:
Und die Sache mit dem hoverEnterEvent ist ein böööööser Lesefehler 
Der Typ für den Event-Parameter heißt nicht "QGraphicsSceneMouseEvent" sondern "QGraphicsSceneHoverEvent"
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
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);
}Der Typ für den Event-Parameter heißt nicht "QGraphicsSceneMouseEvent" sondern "QGraphicsSceneHoverEvent"