• 坐标的变换


    QPainter可以使用以下函数变换坐标:

    QPainter::scale()缩放坐标系统
    QPainter::rotate()顺时针旋转
    QPainter::translate()平移
    QPainter::shear()围绕原点来扭曲坐标系统
    QTransfrom  T用该对象来保存设置过程
    setTransfrom()设置Transfrom

    缩放 (QPainter::scale)

    QPainter::scale(qreal sx,qreal sy)

    • sx   为   x轴的倍数
    • sy   为   y轴的倍数

    放大:

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. QPen pen(Qt::black);
    5. painter.setPen(pen);//设置笔
    6. painter.drawRect(100,100,100,100);
    7. painter.scale(2,2);//x,y翻2
    8. painter.drawRect(100,100,100,100);//相当于drawRect(200,200,200,200)
    9. }

     缩小:

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. QPen pen(Qt::black);
    5. painter.setPen(pen);//设置笔
    6. painter.drawRect(100,100,100,100);
    7. //painter.scale(2,2);//x,y放大2
    8. //painter.drawRect(100,100,100,100);//相当于drawRect(200,200,200,200)
    9. painter.scale(0.5,0.5);//x,y缩小2
    10. painter.drawRect(100,100,100,100);//相当于drawRect(50,50,50,50)
    11. }

     注意:当使用多次scale时,它们是结合一起使用。

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. QPen pen(Qt::black);
    5. painter.setPen(pen);//设置笔
    6. painter.scale(2,2);//x,y放大2
    7. painter.scale(0.5,0.5);//x,y缩小2
    8. //相当于放大2倍 缩小2倍 相当于没变换
    9. painter.drawRect(100,100,100,100);//相当于drawRect(100,100,100,100)
    10. }

     旋转(QPainter::rotate)

    QPainter::rotate(qreal angle)

    • angle为角度
    • 以原点坐标

    初始状态:

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. QPen pen(Qt::black);
    5. painter.setPen(pen);//设置笔
    6. painter.drawRect(100,0,100,100);
    7. }

     旋转30°

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. QPen pen(Qt::black);
    5. painter.setPen(pen);//设置笔
    6. painter.rotate(30);
    7. painter.drawRect(100,0,100,100);
    8. }

    移动坐标再旋转:

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPen pen(Qt::cyan);
    4. pen.setBrush(Qt::blue);
    5. pen.setWidth(2);
    6. QPainter painter(this);
    7. painter.translate(100,100);//移动坐标
    8. painter.drawLine(0,0,0,-100);//绘制线段
    9. painter.rotate(200);//旋转270°
    10. painter.drawLine(0,0,0,-100);//绘制线段
    11. }

     

     

     平移(QPainter::translate)

    QPainter::translate(constQPointF&offset)

    • offset   x轴的增量和y轴的增量

    初始状态: 

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. QPen pen(Qt::black);
    5. painter.setPen(pen);//设置笔
    6. painter.drawRect(100,0,100,100);
    7. }

     平移:

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. QPen pen(Qt::black);
    5. painter.setPen(pen);//设置笔
    6. painter.translate(100,100);//x坐标加100 y坐标加100
    7. painter.drawRect(100,0,100,100);
    8. }

     切变坐标系(QPainter::shear)

    QPainter::shear(qrealshqrealsv)

    • 按 (shsv) 切变坐标系
    • sh横向扭曲
    • sv纵向扭曲

    初始状态:

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. QPen pen(Qt::black);
    5. painter.setPen(pen);//设置笔
    6. painter.drawRect(100,0,100,100);
    7. }

     扭曲坐标:

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. QPen pen(Qt::black);
    5. painter.setPen(pen);//设置笔
    6. painter.shear(0,1);//纵向扭曲
    7. painter.drawRect(100,0,100,100);
    8. }

    钟表的指针的移动过程:

    在头文件中添加:

    1. int angle=0;//弧度
    2. void paintEvent(QPaintEvent *event);//绘图事件

    构造函数中添加:

    1. QTimer *time=new QTimer(this);
    2. connect(time,&QTimer::timeout,this,[=](){
    3. update();//更新数据
    4. });
    5. time->start(1000);//开启定时器

    绘图事件的实现:

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. angle+=10;//每次弧度加10
    4. if(angle==360) angle=0;//当弧度为360时,重置
    5. int side=qMin(width(),height());
    6. QPainter painter(this);
    7. painter.setRenderHint(QPainter::Antialiasing);//开启锯齿
    8. QTransform transform;
    9. transform.translate(width()/2,height()/2);//移动坐标
    10. transform.scale(side/300.0,side/300.0);//缩放
    11. transform.rotate(angle);//旋转
    12. painter.setTransform(transform);//设置过程
    13. painter.drawEllipse(-120,-120,240,240);//画一个圆
    14. painter.drawLine(0,0,100,0);//绘制线段
    15. }

     

     

  • 相关阅读:
    Tomcat启动时出现乱码的解决方式
    怎么进行图片格式转换呢?
    defineExpose ,父组件获取子组件中的属性值
    4-4网络层-IPv6
    windows下gdal的java开发环境搭建
    Rocky Linux 9安装后ssh不能登录
    机器人学习书籍
    【微信小程序入门到精通】— 这篇看完直接拿下 text 和 rich-text 组件!
    数据库性能优化(查询优化、索引优化、负载均衡、硬件升级等方面)
    git从远程仓库拉取指定日期版本的代码到本地
  • 原文地址:https://blog.csdn.net/qq_45303986/article/details/127949599