Entlang eines Rasters zeichnen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
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
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

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
Bottle: Micro Web Framework + Development Blog
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ein einfaches

Code: Alles auswählen

(x+5) / 10 * 10
tut es auch, so lange man ganzzahlige Division voraussetzt.
Das Leben ist wie ein Tennisball.
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.
Antworten