• Qt坐标系统


      GUI开发工作怎么都少不了对坐标系统的认识和了解,t中每一个窗口都有一个坐标系,默认窗口左上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小。原点即为(0,0)点,以像素为单位增减。

    一、窗口部件的定位

      GUI程序在坐标系统中进行窗口和部件的定位

         定位类型分为:

         A、顶级窗口部件的定位

         B、窗口内部件的定位

         C、窗口部件的大小设置

         QT使用统一的坐标系统定位窗口部件的位置和大小

         QT部件类提供成员函数在坐标系统中进行定位

      QWidget类提供了窗口部件所需的坐标系统成员函数

      

      intx() const;

         inty() const;

         int width() const;

         int height() const;

         以窗口左上角为坐标系原点,但width()和height()分别为客户区的宽和高

           const QRect &geometry() const;

      intx() const;

      inty() const;

      int width() const;

      int height() const;

         以客户区左上角为坐标系原点,width()和height()分别为客户区的宽和高

      QRectframeGeometry() const;

      intx() const;

      inty() const;

      int width() const;

      int height() const;

           以窗口左上角为坐标系原点,width()和height()分别为窗口的宽和高

    二、坐标系变换

      坐标系变换是利用变换矩阵来进行的, 通常利用QTransform类来设置变换矩阵。QPainter类提供了对坐标系的平移,缩放,旋转,扭曲等变换数。    

      void translate(const QPointF & offset)

         void translate(const QPoint & offset)

         void translate(qreal dx, qreal dy)

         void scale(qreal sx, qreal sy)

         void shear(qreal sh, qreal sv)

         void rotate(qreal angle)

         void save()

         void restore()

    (1)平移变换

        QT利用translate()函数进行平移变换。
    
        平移变换代码:
    
        QPainter painter(this);
    
        painter.setBrush(Qt::yellow);
    
        painter.drawRect(0,0,50,50);
    
        //将当前坐标系下的点(100,100)设为原点
    
        painter.translate(100,100);
    
        painter.setBrush(Qt::red);
    
        painter.drawRect(0,0,50,50);
    
        //将当前坐标系下的点(-100,-100)设为原点
    
        painter.translate(-100,-100);
    
        painter.drawLine(0,0,20,20);

    (2)比例变换

        利用scale()函数进行比例变换,实现缩放效果。
    
        比例变换代码:
    
        QPainter painter(this);
    
        painter.setBrush(Qt::yellow);
    
        painter.drawRect(0,0,100,100);
    
        //将坐标系在x,y方向放大2倍
    
        painter.scale(2,2);
    
        painter.setBrush(Qt::red);
    
        painter.drawRect(50,50,50,50);

    (3)扭曲变换

        利用shear()函数就行扭曲变换。
    
        扭曲变换代码:
    
        QPainter painter(this);
    
        painter.setBrush(Qt::yellow);
    
        painter.drawRect(0,0,50,50);
    
        //对当前坐标系的y轴进行扭曲
    
        painter.shear(0,1);
    
        painter.setBrush(Qt::red);
    
        painter.drawRect(50,0,50,50);

    (4)翻转变换

        利用rotate()函数进行翻转变换。
    
        翻转变换代码:
    
        QPainter painter(this);
    
        //以原点为中心,顺时针旋转30度
    
        painter.rotate(30);
    
        painter.drawLine(0,0,100,0) ;
    
        //以原点为中心,顺时针再旋转30度
    
        painter.rotate(30);
    
        painter.drawLine(0,0,100,0);

    (5)坐标系状态的保护

       绘图过程中需要快速的进行坐标系切换,绘制出不同的图形,因此需要对坐标系状态进行保护,
      可以先利用save()函数来保存坐标系现在的状态,然后进行变换操作,操作完之后,再用restore()
      函数将以前的坐标系状态恢复,本质是对坐标系进行入栈和出栈的操作。 坐标系状态保护代码: QPainter painter(
    this); //保存当前坐标系状态 painter.save(); //平移坐标系原点到(100, 100) painter.translate(100,100); painter.drawLine(0,0,50,50); //将当前原点位于点(100, 100)的坐标系恢复到保存的坐标系状态 painter.restore(); painter.drawLine(0,0,50,50);
  • 相关阅读:
    BZOJ 4802 欧拉函数(Pollard_Rho)
    Codeforces 804E The same permutation(构造)
    Codeforces 804D Expected diameter of a tree(树形DP+期望)
    BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
    BZOJ 2430 [Poi2003]Chocolate(贪心+归并排序)
    BZOJ 1707 [Usaco2007 Nov]tanning分配防晒霜(扫描线+贪心+优先队列)
    BZOJ 1828 [Usaco2010 Mar]balloc 农场分配(贪心+线段树)
    BZOJ 1827 [Usaco2010 Mar]gather 奶牛大集会(树形DP)
    BZOJ 2697 特技飞行(贪心)
    BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)
  • 原文地址:https://www.cnblogs.com/xiaobingqianrui/p/9548698.html
Copyright © 2020-2023  润新知