QGraphicsView 90 degree Rotation



  • Hi all ,

    I try to apply rotation through transform.rotate(90) , Rotation works fine in this case . But when i try to apply zoom , the view disappears in this case . So I wish to find some other way for rotation .

    I have found some example for rotation . Among all transform.setmatrix (m11,m12,m13,m21,m22,m23,m31,m32,m33) works fine .But In the example the matrix values are calculated for 180 degree .
    I want to find the values for 90 degree .
    Means can any one help me to find the values of the matrix for 90 degree





  • Hi !!!!

    Thanks for your reply .
    There is a correction in my angle im using clokwise 90 degree So the angle is -90 degree
    I got the coordinates for the -90 degree matrix
    m11= 0 m12 = 1 m13 = 0
    m21 = -1 m22 = 0 m23 = 0
    m31 = 0 m32 = 0 m33 = 1

    I got the actual transformation which i want .
    But I got another one issue by achieving this.
    When you look into the matrix the value m11 and m22 are equal to zero .
    These m11 is for horizontal scaling and m22 is for vertical scaling
    So in wheelevent when i try to scale the value of horizontal and vertical scaling coordinates it becomes zero
    **view.scale(view.transform().m11()1.05 , view.transform().m22()1.05)
    The value becomes zero in both X and Y.
    So Now my questions i have achieved the transformation but I want some help for handling the wheel vent to zoom the view along -90 degree
    Please can anyone help me on this issue to handle the wheelevent to acheive zoomIn() and zoomOut()



  • See example code below.

    customgraphicsview.h

    #ifndef CUSTOMGRAPHICSVIEW_H
    #define CUSTOMGRAPHICSVIEW_H
    
    #include <QGraphicsView>
    
    class CustomGraphicsView : public QGraphicsView
    {
        Q_OBJECT
    public:
        explicit CustomGraphicsView(QWidget *parent = nullptr);
        void reset();
    
    protected:
        void wheelEvent(QWheelEvent* event) override;
    
    private:
        void updateTransform();
        double m_scale = 1.0;
        double m_angle = 0.0;
    };
    
    #endif // CUSTOMGRAPHICSVIEW_H
    

    customgraphicsview.cpp

    #include "customgraphicsview.h"
    #include <QBrush>
    #include <QColor>
    #include <QWheelEvent>
    
    CustomGraphicsView::CustomGraphicsView(QWidget *parent)
        : QGraphicsView(parent)
    {
        setBackgroundBrush(QBrush(QColor("grey")));
    }
    
    void CustomGraphicsView::reset()
    {
        m_scale = 1.0;
        m_angle = 0.0;
        updateTransform();
    }
    
    void CustomGraphicsView::wheelEvent(QWheelEvent *event)
    {
        auto const delta = (event->delta() <0.0) ? -1.0 : 1.0;
        if (event->modifiers() & Qt::ShiftModifier)
            m_scale += 0.1 * delta;
        else
            m_angle += 15.0 * delta;
        updateTransform();
    }
    
    void CustomGraphicsView::updateTransform()
    {
        QTransform t;
        t.scale(m_scale, m_scale);
        t.rotate(m_angle);
        setTransform(t);
    }
    


  • @Wieland said in QGraphicsView 90 degree Rotation:

    void CustomGraphicsView::updateTransform()
    {
    QTransform t;
    t.scale(m_scale, m_scale);
    t.rotate(m_angle);
    setTransform(t);
    }

    Thanks for your kind reply with full code .
    When i try to apply this code the code scales the view in x direction . In my caes if i rotate my view 90 clockwise it should scale in Y direction .

    Means in normal mode when i try to zoom , the view should expand by width mean while when i rotate and zoom in that rotated view it should expand in height



  • A Short note to all regarding this issue .

    Currently I have achieved the 90 degree clockwise rotation thourgh

    QTransform transform1;
    transform1.rotate(90);
    // Set the Views transformation
    view()->setTransform(transform1);
    

    Rotation works fine

    I try to achieve zooming functionality using fitInView()

    Normal case
    fitInView(0,0,calcValue,viewRect.height())

    In this case , zooming works fine

    90 rotation case
    fitInView(0,0,viewRect.weight(),calcValue)

    In this case , zooming is not not achieved . Please help me .

    I dont want to use scale() method because I set some restrictions in zooming through calcValue depending on the delta of the wheelEvent



  • Please some one look into this issue . Timely helps are really appreciable .



  • Sry, I think I don't understand exactly what you want to do. Maybe you can draw a few pictures to help my imagination :)



  • I tried to add image in my post but i cant .
    Can you help me on it



  • @Wieland

    X Mode

    **-----------------------------|

    -----------------------------**
    Width

    This is how I locate my graphicsview at initial stage

    Im achieving zooming through wheel event .

    I have currentZoomingWidth level if the delta is +ve then i will increase the currentZoomingWidth level and if it is -ve then i will decrease the currentZoomingWidth
    So finally i find the width to expand (currentZoomingWidth )

    wheelvent()
    {
    fitInVieW(0,0,currentZoomingWidth ,view().geometry().height())
    }
    So zooming is achieved through fitInView()

    Y MODE
    | |
    | |
    | |
    | |
    | | Height
    | |
    | |

    Width

    Like same case im calculating the currentZoomingWidth depending upon the delta and applying it to fitInView() height

    wheelvent()
    {
    fitInVieW(0,0 ,view().geometry().width(),currentZoomingWidth)
    }

    In X mode i apply the calculated zoom factor to width and in Y mode I apply it to the height

    My problem is In X mode the fit in view works fine but in Y mode it works weird



  • @keksi-venksi said in QGraphicsView 90 degree Rotation:

    I tried to add image in my post but i cant .
    Can you help me on it

    Hi! The image-upload feature on our forum is broken, you might see the picture but other users don't. Please upload your image to a image hoster of your choice (e.g. postimage.org) and embed the pic here with the following markup: ![alternate text](image-url). See also How to insert image on this forum and Hitchhiker's Visual Guide to the Qt Forum.



  • @Wieland

    I have explained my query in my previous post . Please give your suggestions
    graphicsview

    Any how i have added the image here .This is how my graphicsview rotated .
    Now i wanna apply zooming functionality using fitinview in this 90 degree rotated graphicsview .

    This is how Y Mode looks


  • Qt Champions 2016

    Use two QTransform objects - one for rotation and one for scaling, then multiply them in the proper order (the order of multiplication matters as scaling and rotation don't commute). After that apply your transform to whatever you need.



  • @kshegunov
    Thanks for your reply .
    Can you give some example code .


  • Qt Champions 2016

    QTransform rotation;
    rotation.rotate(90);
    
    QTransform scaling;
    scaling.scale(0.5, 1);
    
    setTransform(rotation * scaling);
    // Or
    QVector2D vector;
    vector = rotation * scaling * vector;
    

    Modify according to your needs.



  • @kshegunov

    Thanks for your reply .

    In my case I dont want to use scale to zoom

    I wish to use fitInView() to achieve zoom.

    In short note after applying transform (rotate 90 degree) fitInView() does not works fine . I want fitInView() to do zoom



  • @keksi-venksi

    Can any one help me on it .
    Helps are really appreciable



  • customgraphicsview.h

    #ifndef CUSTOMGRAPHICSVIEW_H
    #define CUSTOMGRAPHICSVIEW_H
    
    #include <QGraphicsView>
    
    class CustomGraphicsView : public QGraphicsView
    {
        Q_OBJECT
    public:
        enum class Mode
        {
            x,
            y
        };
    
        explicit CustomGraphicsView(QWidget *parent = nullptr);
        void reset();
        void fit();
        void setMode(Mode mode);
    
    protected:
        void wheelEvent(QWheelEvent* event) override;
    
    private:
        void updateTransform();
        Mode m_mode = Mode::x;
        double m_scale = 1.0;
    };
    
    #endif // CUSTOMGRAPHICSVIEW_H
    

    customgraphicsview.cpp

    #include "customgraphicsview.h"
    #include <QBrush>
    #include <QColor>
    #include <QWheelEvent>
    #include <QDebug>
    
    CustomGraphicsView::CustomGraphicsView(QWidget *parent)
        : QGraphicsView(parent)
    {
        setBackgroundBrush(QBrush(QColor("grey")));
    }
    
    void CustomGraphicsView::reset()
    {
        m_mode = Mode::x;
        m_scale = 1.0;
        updateTransform();
    }
    
    void CustomGraphicsView::fit()
    {
        auto const r = scene()->itemsBoundingRect();
        switch (m_mode) {
        case Mode::x: {
            double f1 = width() / (r.width() + 2);
            double f2 = height() / (r.height() + 2);
            m_scale = qMin(f1,f2);
            updateTransform();
            break;
        }
        case Mode::y: {
            double f1 = height() / (r.width() + 2);
            double f2 = width() / (r.height() + 2);
            m_scale = qMin(f1,f2);
            updateTransform();
            break;
        }
        }
    }
    
    void CustomGraphicsView::setMode(CustomGraphicsView::Mode mode)
    {
        if (m_mode == mode)
            return;
        m_mode = mode;
        updateTransform();
    }
    
    void CustomGraphicsView::wheelEvent(QWheelEvent *event)
    {
        auto const delta = (event->delta() <0.0) ? -1.0 : 1.0;
        m_scale += 0.1 * delta;
        updateTransform();
    }
    
    void CustomGraphicsView::updateTransform()
    {
        QTransform t;
        if (m_mode == Mode::y)
            t.rotate(90);
        t.scale(m_scale, m_scale);
        setTransform(t);
    }
    


  • @keksi-venksi

    I would like to continue with this thread

    in the normal mode im using view->fitInView(rect.x(),0,rect.width(),30)

    in the 90 degree rotated mode im using view->fitInView(0,rect.y(),30,rect.height())

    I have tried with different combinations of fitInView for 90 degree rotataion Nothing works

    Can any one suggest me the coordinates for the fitInView() for the rotated view

    Help me on it



  • @keksi-venksi Please try the code above that I just posted. If I understood you right, then it should meet your requirements :)



  • @Wieland
    @Wieland

    Thanks for your reply

    I am using fitInView in many places in my project to work stable . So I would like to get some suggestions for fitInView() coordinates



  • @keksi-venksi said in QGraphicsView 90 degree Rotation:

    I am using fitInView in many places in my project to work stable . So I would like to get some suggestions for fitInView() coordinates

    This is probably my last posting here because I think I can't help you. Have you seen my code above? The fit() function? It does just what you want, look:



  • Hi

    Thanks for your reply

    In this example in fit method you are trying it to fit the view in the frame when we click a button but my case i have used fitInView() while zooming .So it should adjust the view with the zooming delta

    So when ever we zoom fitInView() should be adjusted accordingly to the scene and update the scene as well



  • @keksi-venksi

    To All The issue has been fixed

    what i did was simple

    X mode fitinview(0,0,calcValue,viewRectHeight)

    Y Mode fitinview(0,0,viewRectWidth,calcValue) ; rotate(90)

    After calling fitinview again im calling rotate of 90 degree


  • Moderators

    @keksi-venksi
    Could you please mark this topic as solved then. Others will find it easier if they have similar questions.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.