Best place to apply a QMatrix transform to paint() event in an app
Hello all,
I am working on a mathematics tutor app and so I need to transform my coordinate space into traditional Cartesian Coordinates.
I have found a solution here: http://stackoverflow.com/questions/4...painter-y-axis
which I have added to one of my QGraphicsItem object's paint() event handlers for testing but I would like to apply it at a more global scale. I looked at the widget I am using as the QGraphicsView as the place to set this however it doesn't have a paint(), just these:
If I wanted to plug the code into my application so that EVERYTHING is drawn automagically in the coordinate system I need it to be, where is the best place to put it?
Code I have added to my QGraphicsItem:
Code:
// Setting the matrix rotates the drawing area to be a normal cartesian plane. Unfortunately
// it also means that the original drawing has to be tweaked
matrix.scale(1, -1);
pPainter -> setMatrix(matrix);
One further note I would like to make, is I would like to affect ONLY the drawing of objects, not the interaction of mouse clicks and what not. Unless they are inseparable I mean...
Thank you!
- Caolan
Re: Best place to apply a QMatrix transform to paint() event in an app
Is something like QGraphicsView::setTransform what you're looking for?
Re: Best place to apply a QMatrix transform to paint() event in an app
based ont he link you gave, it transforms to view coordinates which as I understand it only affect coordinates system with respect to World and local coordinates. It does not do any kind of flip of the y-axis like the QMatrix example I used above seems to do.
I could be wrong, I am new to this, however that is my interpretation.
Re: Best place to apply a QMatrix transform to paint() event in an app
QTransform is a type of matrix that supports perspective transformations (including affine).
QMatrix only supports affine transformations (translation, rotation, shear and scale).
You can create a QTransform and use QTransform::scale( 1.0, -1.0 ) (to flip the vertical axis) and then assign it to the graphics view using setTransform.
Then consider your graphics scene as in cartesian coordinates: treat all coordinates as in a cartesian space. When displayed through the graphics view, the transform of the graphics view will convert from cartesian to device coordinates.
Re: Best place to apply a QMatrix transform to paint() event in an app
GREAT! Thank you so very much!
-Caolan.
Re: Best place to apply a QMatrix transform to paint() event in an app
Aaaaaaaand now everything in my view is upside down... *facepalm* :)
Re: Best place to apply a QMatrix transform to paint() event in an app
Here's a suggestion: translate that transform to the centre of the viewport. It should look more like a cartesian representation.
Code:
QPoint viewportCentre
= viewport
().
rect().
center();
QTransform::translate( viewportCentre.x(), viewportCentre.y() );
Make sure you are specifying coordinates in "cartesian" space: +X is to the right, +Y is up.
Re: Best place to apply a QMatrix transform to paint() event in an app
Quote:
Originally Posted by
Kryzon
Here's a suggestion: translate that transform to the centre of the viewport. It should look more like a cartesian representation.
Code:
QPoint viewportCentre
= viewport
().
rect().
center();
QTransform::translate( viewportCentre.x(), viewportCentre.y() );
Make sure you are specifying coordinates in "cartesian" space: +X is to the right, +Y is up.
I got it all to work. Thank you very much!