from PyQt5 import QtGui, QtCore, QtWidgets
class TestAxis(QtWidgets.QGraphicsWidget):
def __init__(self):
QtWidgets.QGraphicsWidget.__init__(self)
self.
boundingRectCopy = QtCore.
QRectF()
def boundingRect(self):
# Axis cannot call sceneRect() to get scene size in
# boundingRect() b/c infinite recursion.
return self.boundingRectCopy
class TestAxisX(TestAxis):
def __init__(self):
TestAxis.__init__(self)
def paint(self, painter, op, widget):
sceneRect = self.scene().sceneRect()
dispMin = sceneRect.left()
dispMax = sceneRect.right()
painter.drawLine(dispMin, 0, dispMax, 0)
class TestAxisY(QtWidgets.QGraphicsWidget):
def __init__(self):
TestAxis.__init__(self)
def paint(self, painter, op, widget):
sceneRect = self.scene().sceneRect()
dispMin = sceneRect.top()
dispMax = sceneRect.bottom()
painter.drawLine(0, dispMin, 0,dispMax)
def __init__(self, scene, axisX, axisY):
self.axisX = axisX
self.axisY = axisY
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
def sceneRectFromViewport(self):
viewportOrigin
= self.
mapToScene(QtCore.
QPoint(0,
0)) viewportSize
= self.
mapToScene(QtCore.
QPoint(self.
viewport().
rect().
width(), \
self.viewport().height()))
return QtCore.
QRectF(viewportOrigin, viewportSize
)
# Force the scene's boundingRect to match the view/ensure axis updated.
def resizeEvent(self, ev):
self.centerOn(0, 0) # Resizes to make the viewed scene smaller will
# be off-center without this.
sceneRectFromViewport = self.sceneRectFromViewport()
# View and Scene SceneRects are coupled until one or the other is
# manually set. We want them coupled, but without the default rules
# that Scene uses to set its SceneRect size.
self.setSceneRect(sceneRectFromViewport)
self.scene().setSceneRect(sceneRectFromViewport)
# assert self.sceneRectFromViewport() == self.scene().sceneRect(), "viewport {0}, scene {1}".format(self.sceneRectFromViewport(), self.scene().sceneRect())
self.axisX.boundingRectCopy = self.scene().sceneRect()
self.axisY.boundingRectCopy = self.scene().sceneRect()
self.axisX.prepareGeometryChange()
self.axisY.prepareGeometryChange()
if __name__ == "__main__":
axisX = TestAxisX()
axisY = TestAxisY()
scene.addItem(axisX)
scene.addItem(axisY)
view = TestView(scene, axisX, axisY)
win.setCentralWidget(view)
win.show()
app.exec()
from PyQt5 import QtGui, QtCore, QtWidgets
class TestAxis(QtWidgets.QGraphicsWidget):
def __init__(self):
QtWidgets.QGraphicsWidget.__init__(self)
self.boundingRectCopy = QtCore.QRectF()
def boundingRect(self):
# Axis cannot call sceneRect() to get scene size in
# boundingRect() b/c infinite recursion.
return self.boundingRectCopy
class TestAxisX(TestAxis):
def __init__(self):
TestAxis.__init__(self)
def paint(self, painter, op, widget):
sceneRect = self.scene().sceneRect()
dispMin = sceneRect.left()
dispMax = sceneRect.right()
painter.drawLine(dispMin, 0, dispMax, 0)
class TestAxisY(QtWidgets.QGraphicsWidget):
def __init__(self):
TestAxis.__init__(self)
def paint(self, painter, op, widget):
sceneRect = self.scene().sceneRect()
dispMin = sceneRect.top()
dispMax = sceneRect.bottom()
painter.drawLine(0, dispMin, 0,dispMax)
class TestView(QtWidgets.QGraphicsView):
def __init__(self, scene, axisX, axisY):
QtWidgets.QGraphicsView.__init__(self, scene)
self.axisX = axisX
self.axisY = axisY
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
def sceneRectFromViewport(self):
viewportOrigin = self.mapToScene(QtCore.QPoint(0,0))
viewportSize = self.mapToScene(QtCore.QPoint(self.viewport().rect().width(), \
self.viewport().height()))
return QtCore.QRectF(viewportOrigin, viewportSize)
# Force the scene's boundingRect to match the view/ensure axis updated.
def resizeEvent(self, ev):
QtWidgets.QGraphicsView.resizeEvent(self, ev)
self.centerOn(0, 0) # Resizes to make the viewed scene smaller will
# be off-center without this.
sceneRectFromViewport = self.sceneRectFromViewport()
# View and Scene SceneRects are coupled until one or the other is
# manually set. We want them coupled, but without the default rules
# that Scene uses to set its SceneRect size.
self.setSceneRect(sceneRectFromViewport)
self.scene().setSceneRect(sceneRectFromViewport)
# assert self.sceneRectFromViewport() == self.scene().sceneRect(), "viewport {0}, scene {1}".format(self.sceneRectFromViewport(), self.scene().sceneRect())
self.axisX.boundingRectCopy = self.scene().sceneRect()
self.axisY.boundingRectCopy = self.scene().sceneRect()
self.axisX.prepareGeometryChange()
self.axisY.prepareGeometryChange()
if __name__ == "__main__":
app = QtWidgets.QApplication([])
win = QtWidgets.QMainWindow()
axisX = TestAxisX()
axisY = TestAxisY()
scene = QtWidgets.QGraphicsScene()
scene.addItem(axisX)
scene.addItem(axisY)
view = TestView(scene, axisX, axisY)
win.setCentralWidget(view)
win.show()
app.exec()
To copy to clipboard, switch view to plain text mode
Bookmarks