Seite 1 von 1

Rechteck in GraphicsView bei mouseMoveEvent nur manchmal gez

Verfasst: 18. April 2009 00:27
von GammaBlitz
Hallo!
Ich habe eine class GraphicsViewFractalCanvas : public QGraphicsView abgeleitet.
Diese Klasse verwaltet eine QGraphicsScene und ein QImage.
Bei einen GraphicsView-mouseMoveEvent soll immer ein Rechteck entsprechend der
Mausbewegung gezeichnet werden. Leider klappt es nur zu ungefähr 50% der Versuche.
Kann mir jemand helfen und erklären, warum es manchmal klappt und manchmal nicht?
Vielen Dank!

Hier die mouseMoveEvent - Funktion:

void GraphicsViewFractalCanvas::mouseMoveEvent (QMouseEvent *event) {
int mouseCurrX, mouseCurrY;
int minX, maxX, minY, maxY;

mouseCurrX = event->x ();
mouseCurrY = event->y ();

if (event->buttons () != Qt::LeftButton) {
event->ignore ();
return;
}

if (mousePressX <= mouseCurrX) {
minX = mousePressX;
maxX = mouseCurrX;
} else {
minX = mouseCurrX;
maxX = mousePressX;
}
if (mousePressY <= mouseCurrY) {
minY = mousePressY;
maxY = mouseCurrY;
} else {
minY = mouseCurrY;
maxY = mousePressY;
}

if (!selectionRectItem) {
QPen pen;
QBrush brush;

brush.setStyle (Qt::Dense7Pattern);
brush.setColor (QColor (242, 255,0));

pen.setStyle (Qt::DashDotLine);
pen.setWidth (1);
pen.setBrush (Qt::yellow);
pen.setCapStyle (Qt::FlatCap);
pen.setJoinStyle (Qt::MiterJoin);

selectionRectItem = gScene.addRect (minX, minY, 4, 4, pen, brush);
} else
selectionRectItem->setRect (minX, minY, maxX - minX, maxY - minY);
selectionRectItem->update();
selectionRectItem->show ();
invalidateScene (QRectF(), QGraphicsScene::AllLayers);
update ();
}

Verfasst: 18. April 2009 08:13
von upsala
Warum verwendest du kein QGraphicsItem? Man kann normalerweise nur während des paintEvents Zeichnen und sollte es auch nur dann tun.

Edit: Kann ignoriert werden, hab mich total verlesen, aber könnte auch an den fehlenden Code-Tags/Einrückungen liegen...

Re: Rechteck in GraphicsView bei mouseMoveEvent nur manchmal

Verfasst: 18. April 2009 08:21
von franzf
hi,

zu allererst, bitte verwende code-tags, das ist sonst gar nicht schön zu lesen.

dann könntest du gleich zu beginn deines events nachfragen, ob überhaupt ein button gedrückt wurde. wenns nicht unbedingt nen mega-performanceboost gibt, dann ist es in jedem fall schöner :P


Code: Alles auswählen

if (!selectionRectItem) {
        selectionRectItem = gScene.addRect (minX, minY, 4, 4, pen, brush);
    } else
        selectionRectItem->setRect (minX, minY, maxX - minX, maxY - minY);
    selectionRectItem->update();
    selectionRectItem->show ();
    invalidateScene (QRectF(), QGraphicsScene::AllLayers);
    update ();
}
hmm, dir ist schon klar, dass du im ersten if-zweig nur das bereits existierende rectItem änderst? ist das dein ziel? dann hoffe, dass das rect immer oben auf ist (->setZValue()).

und dir ist auch klar, dass du 3x ein update anstößt?
1: addRect
2: invalidateScene
3: update
-> doku

zu guter letzt solltest du dringend dein event, welches aus der view kommt, in die scene mappen (mapToScene) sonst gibts nur falsche rects ;)

grüße
franz

ps:
sry wg. nur kleinschreibung, katze blockiert 2/3 meiner verfügbaren arme :P

setZValue() hatte gefehlt!

Verfasst: 18. April 2009 18:17
von GammaBlitz
Danke Dir, franzf!
Dadurch, dass ich ein GraphicsPixmapItem und ein GraphicsRectItem ohne das Setzen
von setZValue() benutzt hatte, wurde das GraphicsRectItem nur in ca. 50% der
Versuche zu oberst gezeichnet. Das war der Fehler!
Die vielen Updates waren nur verzweifelte Versuche, das GraphicsRectItem erscheinen
zu lassen. Das habe ich inzwischen schon geändert.
Die Abfrage "if (!selectionRectItem)" ist schon richtig, denn nur wenn kein selectionRectItem
existiert, soll eins erzeugt werden.
Vielen Dank nochmal!