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 ();
}
Rechteck in GraphicsView bei mouseMoveEvent nur manchmal gez
-
GammaBlitz
- Beiträge: 17
- Registriert: 18. April 2009 00:10
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...
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.
Re: Rechteck in GraphicsView bei mouseMoveEvent nur manchmal
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
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
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
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 ();
}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
-
GammaBlitz
- Beiträge: 17
- Registriert: 18. April 2009 00:10
setZValue() hatte gefehlt!
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!
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
Qt Version 4.4.3
Qt Creator 1.0.0
KDE 3.5.10