Ich benötige zur Visualisierung von Daten eine skalierbare Zeichenfläche. Ich weiß allerdings nicht einmal zur Laufzeit wie groß die Grafik schlussendlich wird, bzw die Zeichnung muss sich evt. zur Laufzeit in einer nicht absehbaren Anzahl von Schritten vergrößern. Um mich in die Funktionsweise von QGraphicssene und QGraphicsview reinzudenken hab ich erstmal mit ner kleinen Spielerei angefangen.
Was das Programm eigentlich machen soll:
- Quadrate an der Curserposition zeichnen
- über das Mausrad Skalierbar sein
- Die Fenstergröße soll variabel sein
Wo liegt das Problem:
- klickt man in den Randbereich des Fensters, so werden die Quadrate nicht an der Mausposition eingefügt
Zur anschauung mal der code (hoffe das ist nicht zu Lang fürs Forum)
Code: Alles auswählen
#!usr/bin/python
import sys, math
from PyQt4 import QtGui
class example(QtGui.QMainWindow):
def __init__(self):
super(example, self).__init__()
self.setupUI()
def setupUI(self):
view = MyGraphicsView()
view.setScene(MyGraphicsSscene())
self.setCentralWidget(view)
self.show()
class MyGraphicsView(QtGui.QGraphicsView):
def __init__(self):
super(MyGraphicsView, self).__init__()
self.setRenderHint(QtGui.QPainter.Antialiasing)
def wheelEvent(self, event):
""" skalieren """
factor = math.pow(2.0, -event.delta() / 240.0)
self.scale(factor, factor)
class MyGraphicsSscene(QtGui.QGraphicsScene):
def __init__(self):
super(MyGraphicsSscene, self).__init__()
def mousePressEvent(self, event):
""" zeichnen """
point = event.scenePos()
self.drawPoint(point.x(), point.y())
def drawPoint(self, x, y):
""" Zeichenmethode """
item = QtGui.QGraphicsRectItem(x-10, y-10, 20, 20)
self.addItem(item)
def main():
app = QtGui.QApplication(sys.argv)
window = example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
beim ersten klick wirde die Größe der Scene genau auf die Größe eines Rechtecks festgelegt. Klickt man dann erneut, liegt der Curser nicht mehr in der Scene von der ich eigentlich die Koordinaten abfrage. Aus irgendeinem Grund (versteh ich nicht genau - Erklärung wäre gewünscht) vergrößert sich die Scene jetzt. Wenn ich nun in einen Bereich klicke der mit Sicherheit in der Scene liegt macht das Programm genau das was es machen soll.
Meine Frage:
Wie löse ich diese Problem am intelligentesten, mir schwebt vor die Größe der Scene im Wheelevent anzupassen, allerdings muß dabei der aktuelle Skalierungszustand berücksichtigt werden. Außerdem wird eine Größenänderung des Fensters damit nicht berücksichtigt.
Ich freue mich über eure Ratschläge,
Gruß Arthur Dent