QCanvasItems lassen sich nicht bewegen!

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Deever
User
Beiträge: 15
Registriert: Samstag 30. Juli 2005, 12:46

Hey Amigos, wie geht's?

Also ein entsprechender C++ funktioniert, genauso wie ich mir das vorstelle, ich möchte das Programm allerdings in Python realisiern.
Das Problem ist, daß die Rectangle-Objekte nicht bewegt werden können, weil den Positionswerten der Events offenbar falsche Werte übergeben werden (siehe Ausgabe). Kann mir jemand helfen? Weil ich denke nicht, daß es sich hier um einen Bug in PyQt handeln kann.

Vielen Dank für eure Hilfe!
Gruß,
/dev

Code: Alles auswählen

from qt import *
from qtcanvas import *
import sys

qApp.__init__(sys.argv)

class CanvasView(QCanvasView):
	def __init__(self, canvas, parent=None, name=None):
		QCanvasView.__init__(self, canvas, parent, name)
		self.canvas = canvas
		self.activeItems = set()
	def activateItem(self, item):
		item.setActive(True)
		self.activeItems.add(item)
	def deactivateItem(self, item):
		item.setActive(False)
		self.activeItems.remove(item)
	def activateAllItems(self):
		map(self.activateItem, self.allItems())
		self.canvas.update()
	def deactivateAllItems(self):
		for item in self.activeItems:
			item.setActive(False)
		self.activeItems = set()
		self.canvas.update()
	def contentsMousePressEvent(self, event):
		if event.button() == Qt.LeftButton:
			items = self.canvas.collisions(event.pos())
			if len(items)==0:
				self.deactivateAllItems()
			else: self.activateItem(items[0])
			self.lastPos = event.pos()
			self.canvas.update()
	def contentsMouseMoveEvent(self, event):
		if event.state() & Qt.LeftButton:
			if len(self.activeItems):
				print event.pos().x()-self.lastPos.x(), event.pos().y()-self.lastPos.y()
				for item in self.activeItems:
					item.moveBy(event.pos().x() - self.lastPos.x(), event.pos().y() - self.lastPos.y())
				self.lastPos = event.pos()
				self.canvas.update()

class Rectangle(QCanvasRectangle):
	def __init__(self, x1, y1, x2, y2, canvas):
		QCanvasRectangle.__init__(self, QRect(QPoint(x1, y1), QPoint(x2, y2)) , canvas)
	def drawShape(self, painter):
		QCanvasRectangle.drawShape(self, painter)
		if self.isActive():
			r = self.rect()
			self.drawHandle(painter, r.topLeft())
			self.drawHandle(painter, r.topRight())
			self.drawHandle(painter, r.bottomLeft())
			self.drawHandle(painter, r.bottomRight())
	def drawHandle(self, painter, point):
		painter.setPen(Qt.black)
		painter.setBrush(Qt.gray)
		painter.drawRect(point.x()-3, point.y()-3, 7, 7)

c = QCanvas(500, 500)
r1 = Rectangle(20, 20, 40, 40, c)
r1.show()
r2 = Rectangle(50, 20, 90, 60, c)
r2.show()
c.update()

m = CanvasView(c)
qApp.setMainWidget(m)
m.show()
qApp.exec_loop()
Edit (Leonidas): Code in Python-Tags gesetzt.
killgus
User
Beiträge: 1
Registriert: Sonntag 7. Mai 2006, 12:55

Probier's mal mit diesen geänderten Methoden:
def contentsMousePressEvent(self, event):
...
self.lastx = event.pos().x() # neu
self.lasty = event.pos().y() # neu
...
def contentsMouseMoveEvent(self, event):
...
print event.pos().x()-self.lastx, event.pos().y()-self.lasty
for item in self.activeItems:
item.moveBy(event.pos().x()-self.lastx, event.pos().y()-self.lasty)
self.lastx = event.pos().x()
self.lasty = event.pos().y()
...

Ich glaube, dass deine Eventposition 'byReference' an lastPos weitergegeben wurde und dadurch die Differenz aus aktuellem x-Wert und letztem x-Wert auch immer 0 war.
Antworten