Rechteck in GraphicsView bei mouseMoveEvent nur manchmal gez

Alles rund um die Programmierung mit Qt
Antworten
GammaBlitz
Beiträge: 17
Registriert: 18. April 2009 00:10

Rechteck in GraphicsView bei mouseMoveEvent nur manchmal gez

Beitrag 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 ();
}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
Zuletzt geändert von upsala am 18. April 2009 09:38, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Rechteck in GraphicsView bei mouseMoveEvent nur manchmal

Beitrag 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
GammaBlitz
Beiträge: 17
Registriert: 18. April 2009 00:10

setZValue() hatte gefehlt!

Beitrag 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!
Betriebssystem Linux.
Qt Version 4.4.3
Qt Creator 1.0.0
KDE 3.5.10
Antworten