ich habe ein Verständnisproblem mit QGraphicsView und QGraphicsScene.
In meinem Beispielprogramm werden mehrere Rechtecke gezeichnet. Die zwei kleinen Rechtecke sollen sich dann innerhalb des großen Rechtecks bewegen. Bei dem Rechteck, das bei 0,0 eingefügt wurde funktioniert das gut, das andere rutscht immer über die Begrenzung hinaus.
Worauf beziehen sich die Koordinaten, die ich mit punkt=self.rect.scenePos() ermittle?
Wie kann ich die Koordinaten auf QGraphicsScene ( "Modellbereich"?) umrechnen?
Viele Grüße
Martin
Code: Alles auswählen
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGraphicsView, QGraphicsScene, \
QVBoxLayout, QHBoxLayout, QPushButton
from PyQt5.QtCore import QTimer
class Fenster(QWidget):
def __init__(self):
super().__init__()
self.resize(800,600)
self.btnZeichne=QPushButton("Rechtecke zeichnen", self)
self.btnStart=QPushButton("Start", self)
self.btnStop=QPushButton("Stop", self)
self.scene = QGraphicsScene()
self.view = QGraphicsView(self.scene)
hbl = QHBoxLayout()
hbl.addWidget(self.btnZeichne)
hbl.addWidget(self.btnStart)
hbl.addWidget(self.btnStop)
vbl = QVBoxLayout()
vbl.addWidget(self.view)
vbl.addLayout(hbl)
self.btnZeichne.clicked.connect(self.zeichne)
self.btnStart.clicked.connect(self.start)
self.btnStop.clicked.connect(self.stop)
self.setLayout(vbl)
self.show()
def zeichne(self):
self.rect1=self.scene.addRect(0,0,550,350)
self.rect2=Rechteck(0,0,50,50)
self.rect3=Rechteck(100,50,50,50)
def start(self):
try:
self.rect2.start()
self.rect3.start()
except:
pass
def stop(self):
try:
self.rect2.stop()
self.rect3.stop()
except:
pass
class Rechteck():
def __init__(self, x1, y1, x2, y2):
self.rect=w.scene.addRect(x1,y1,x2,y2)
self.timer=QTimer()
self.timer.timeout.connect(self.move)
self.directionX=1
self.directionY=1
def move(self):
punkt=self.rect.scenePos()
if(punkt.x()>500 and self.directionX==1):
self.directionX=-1
if(punkt.x()<0 and self.directionX==-1):
self.directionX=+1
if(punkt.y()>300 and self.directionY==1):
self.directionY=-1
if(punkt.y()<0 and self.directionY==-1):
self.directionY=+1
self.rect.moveBy(self.directionX,self.directionY)
def start(self):
self.timer.start(8)
def stop(self):
self.timer.stop()
app=QApplication(sys.argv)
w=Fenster()
sys.exit(app.exec_())