[PyQt] How to tell when QGraphicsView's transformation matrix has been changed?

TP wingusr at gmail.com
Mon Oct 11 14:20:36 BST 2010


On Mon, Oct 11, 2010 at 5:18 AM, TP <wingusr at gmail.com> wrote:
> I am trying to implement an image processing application that will
> have multiple image viewers created with a subclass of QGraphicsView.
> I need to be able to optionally keep all the image viewers in sync
> with respect to zoom and position as the user clicks on the
> scrollbars, uses the scroll wheel to zoom, uses menus to fit the view
> to the window, etc.
>
> Looking at C:\Qt\4.6.1\src\gui\graphicsview\qgraphicsview.cpp it seems
> like I should be able to do the following:
>
>  class ImageViewerView(QtGui.QGraphicsView):
>      def __init__(self, scene=None, parent=None):
>          if scene:
>              super(ImageViewerView, self).__init__(scene, parent)
>          else:
>              super(ImageViewerView, self).__init__(parent)
>
>      def setTransform(self, QTransform, combine=False):
>          super(ImageViewerView, self).setTransform(QTransform, combine)
>          print("transform = %s, %s" % (QTransform, combine))
>
> to keep track of view changes since things like fitInView() calls
> scale() which in turns calls setTransform().
>
> However, when I run my test application I never seem to see any calls
> to setTransform()?
>
> So... how does one determine when a QGraphicsView's transform has been
> changed? I didn't see any applicable built-in signals, so I figured
> I'd just emit my own, but now I can't quite see where to do that.
>
> Or maybe there's an entirely different way to track changes to a QGraphicsView?
>

I just figured out why my setTransform() method is never called. It's
because the underlying C++ method isn't declared as virtual (you can
only tell this by looking at the Qt docs rather than the PyQt docs).

I'd still like to know how to tell when a QGraphicsView's view changes?


More information about the PyQt mailing list