[QGraphicsView] mouseEvents an Item weiterreichen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Qdeep

Hallo!

Ich versuche in meinem QGraphicsView die Mouse Events auf eingefügte rectItems abzufangen. Letztendlich soll man sie per Klick verschieben können.
Leider fängt meine View schon die Klicks ab und reicht sie nicht auf das unter der Maus befindliche Item weiter.

Ich meinem Fall sind die Items von der Klasse QGraphicsRectItem abgeleitet.

Code: Alles auswählen

class GatAnd(QtGui.QGraphicsRectItem):
	def __init__(self, scene, parent, x, y):
		super(QtGui.QGraphicsRectItem, self).__init__(None, scene)
		
		self.setCursor(QtCore.Qt.IBeamCursor)
	
	def mouseMoveEvent(self, event):
		print("mouseMoveEvent")
	
	def mousePressEvent(self, event):
		print("mousePressEvent")
	
	def sceneEvent(self, event):
		print("sceneEvent")
		return True
	
	def hoverMoveEvent(self, event):
		print("hoverMoveEvent")
(Probeweise habe ich den Cursor umgestellt, aber nicht mal der ändert sich bei einem hover.)

Hinzugefügt wird das Item nicht per scene.addItem(), sondern erscheint direkt auf der Scene, wenn ich eine Instanz des Objekts in einer Variable referenziere:

Code: Alles auswählen

newElem = elements.GatAnd(self.scene, None, x, y)
Danke im Voraus!
Qdeep


PS: Das einzige Event, das durchkommt, ist das sceneEvent, allerdings nur beim Rechtsklick auf das Item...
Qdeep

Gibt es keine andere Möglichkeit außer die Events, die im View abgefangen werden, darauf zu checken, ob an der Stelle ein Item liegt und es ggf. daran weiterzuleiten?
Qdeep

Update: Die Events an die Items kommen nur nicht durch, wenn die mouseEvents im View oder in der Scene implementiert wurden. Lösche ich also alle mouseEvents aus den View/Scene-Klassen, empfangen meine Items ihre Events.

Gibt es keine Möglichkeit, auch in der Scene schon Events abzufangen ohne dass sie danach nicht weitergeleitet werden?
Ich wüsste sonst nicht, wie ich ein neues Item bis zum ersten Klick den Mauszeiger verfolgen lassen soll.
fabi1511
User
Beiträge: 23
Registriert: Donnerstag 25. Juni 2009, 18:59

Jedes QWidget implementiert eine methode childAt(self, pos)
also sollte das Problem etwa so lösbar sein:

Code: Alles auswählen

def mousePressEvent(self, event):
    child=self.childAt(event.pos())
    if child is None:
        pass # Was halt passieren soll, wenn an der Stelle nichts ist...
    else:
        child.methodexy(event)
methodexy steht hier für die Methode des childs die das event weiterverarbeitet, sollte jedoch nicht mousePressEvent heißen, das könnte zu nicht gewolltem verhalten führen

ich hoffe ich konnte dir, wenn auch spät helfen...
Antworten