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()