Seite 1 von 1

Entlang eines Rasters zeichnen

Verfasst: Freitag 18. Dezember 2009, 17:09
von Qdeep
Hallo!

Ich versuche in PyQt mit dem Graphics View Framework auf einem Raster zu zeichnen. Ich mein damit die Möglichkeit, Elemente nicht pixelgenau zu verschieben, sondern z. B. in 10px-Sprüngen.

Ich hatte bisher folgende Umsetzung:

Code: Alles auswählen

def mouseMoveEvent(self, event):
	#save current (rasterized) mouse position // x
	if (int(str(event.x())[-1]) < 5):
		self.mPos[0] = (event.x() / 10) *10
	else:
		self.mPos[0] = (event.x() / 10 + 1) *10
	
	#y
	if (int(str(event.y())[-1]) < 5):
		self.mPos[1] = (event.y() / 10) *10
	else:
		self.mPos[1] = (event.y() / 10 + 1) *10
Ich versuche also, in die Variable mPos den aktuellen (x|y)-Wert des Mauszeigers zu speichern, allerdings auf den Zehner abgerundet (wenn letzte Stelle < 5) oder aufgerundet (wenn letzte Stelle >= 5).
Dann wird das Element, in dem Fall eine QLine, auf diese Position geupdatet.
Das Problem bei dieser Methode ist, dass wenn die Position aufgerundet wird, die Linie nicht vollständig aktualisiert wird, also nicht 10px länger wird, sondern nur ca. 1px. Erst wenn ich eine neue Linie zeichne, wird die Linie aktualisiert richtig gezeichnet.

Es gibt also zwei Möglichkeiten mir zu helfen :) Entweder ihr habt eine Idee, wie man diese Fehlfunktion(?) umgehen kann oder ihr habt zufällig eine andere Umsetzungsidee!

Für beides bin ich dankbar,
Qdeep

Verfasst: Freitag 18. Dezember 2009, 21:49
von Defnull
Was zum Teufel machst du da? Besonders Zeile 3 und 9 sind abenteuerlich.

Code: Alles auswählen

def mouseMoveEvent(self, event):
    x = int(event.x())
    y = int(event.y())
    self.mPos[0] = x - ((x+5) % 10) + 5
    self.mPos[1] = y - ((y+5) % 10) + 5

Verfasst: Samstag 19. Dezember 2009, 12:25
von EyDu
Ein einfaches

Code: Alles auswählen

(x+5) / 10 * 10
tut es auch, so lange man ganzzahlige Division voraussetzt.

Verfasst: Samstag 19. Dezember 2009, 13:18
von Qdeep
Okay, habe ich übernommen

Das ändert leider nichts an dem Problem, dass Qt die Linie nicht richtig updatet. Sie wird immernoch an der Stelle, wo sie 10px weiterspringen soll, nur 1px länger, bis ich sie noch weiter ziehe; dann erst springt sie 10px weiter. Oder bis ich eine neue Linie zeichne; dann springt die vorherige an die richtige Rasterposition.