zoukankan      html  css  js  c++  java
  • Qt之图形(转换)

    简述

    QTransform类指定坐标系的2D转换,可以指定平移、缩放、扭曲(剪切)、旋转或投影坐标系。绘制图形时,通常会使用。

    QTransform与QMatrix的不同之处在于,它是一个真正的3x3矩阵,允许视角转换,QTransform的 toAffine()方法允许将QTransform转换到QMatrix。如果视角转换已在矩阵指定,则转换将导致数据丢失。

    常用接口

    函数 描述
    translate(qreal dx, qreal dy) 平移-对坐标系沿着x轴移动dx、沿y轴移动dy
    scale(qreal sx, qreal sy) 缩放-通过水平的sx和垂直的sy缩放坐标系
    rotate(qreal angle, Qt::Axis axis = Qt::ZAxis) 旋转-对指定的轴用给定的角度反时针旋转坐标系统
    shear(qreal sh, qreal sv) 扭曲-通过水平的sh和垂直的sv扭曲坐标系
    reset() 重置为单位矩阵

    正常

    我们先来看正常情况下的效果。

    效果

    这里写图片描述

    源码

    这里,我们绘制了一张从坐标原点开始,长度、宽度均为150的图片。

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        QPainter painter(this);
    
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
    
        painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
    }

    平移

    效果

    这里写图片描述

    源码

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        QPainter painter(this);
    
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
    
        QTransform transform;
        // 平移
        transform.translate(120, 20);
    
        painter.setTransform(transform);
        painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
    }

    translate()可以将坐标原点变更为指定的x、y坐标。这里,将坐标原点由(0, 0)变为(120, 20)。

    旋转

    效果

    Qt::XAxis Qt::YAxis Qt::ZAxis
    这里写图片描述 这里写图片描述 这里写图片描述

    源码

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        QPainter painter(this);
    
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
    
        QTransform transform;
        // 平移
        transform.translate(120, 20);
        // 旋转
        transform.rotate(45, Qt::XAxis);
    
        painter.setTransform(transform);
        painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
    }

    rotate()使用角度技巧表示远近。设置第二个参数为角度的常量值后,可以使用X轴、Y轴、Z轴技巧。它默认是以原点为中心进行旋转的,如果要改变旋转的中心,可以使用translate()函数完成。

    缩放

    效果

    这里写图片描述

    源码

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        QPainter painter(this);
    
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
    
        QTransform transform;
        // 平移
        transform.translate(120, 20);
        // 旋转
        transform.rotate(45);
        // 缩放
        transform.scale(0.5, 0.5);
    
        painter.setTransform(transform);
        painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
    }

    scale()可以进行缩放。这里,使绘制的图像缩小到原来的一半。

    扭曲

    效果

    这里写图片描述

    源码

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        QPainter painter(this);
    
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
    
        QTransform transform;
        // 横向扭曲
        transform.shear(0.5, 0);
    
        painter.setTransform(transform);
        painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
    }

    shear()可以实现图片的扭曲。它有两个参数,前面的参数实现横向变形,后面的参数实现纵向变形。当它们的值为0时,表示不扭曲。

  • 相关阅读:
    第六次作业--结对编程第二次
    OneZero第四周第三次站立会议(2016.4.13)
    结对编程体会2
    OneZero第四周第二次站立会议(2016.4.12)
    关于“单元测试工具”
    OneZero第四周第一次站立会议(2016.4.11)
    OneZero第四周——预完成功能点统计
    OneZero第三周第五次站立会议(2016.4.8)
    OneZero第三周第四次站立会议(2016.4.7)
    OneZero第三周第三次站立会议(2016.4.6)
  • 原文地址:https://www.cnblogs.com/itrena/p/5938344.html
Copyright © 2011-2022 走看看