31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待

在上章和上上上章:

28.QT-QPainter介绍

30.QT-渐变之QLinearGradient、 QConicalGradient、QRadialGradient

学习了QPainter基础绘制后,接下来,来学习QPainter其它函数之rotate()函数

首先来看看QPainter其它函数

void QPainter::drawPixmap ( int x, int y, int w, int h, 
   const QPixmap & pixmap, int sx, int sy, int sw, int sh );
    //绘画pixmap
    // x y w h:表示本身的绘画面积
    //sx sy sw sh:表示pixmap的绘画面积
  

void QPainter::drawPixmap ( int x, int y, const QPixmap & pixmap, int sx, int sy, int sw, int sh  );
    //绘画pixmap
    // x y 表示绘画起始位置
    //sx sy sw sh:表示pixmap的绘画面积

drawTiledPixmap ( int x, int y, int width, int height, const QPixmap & pixmap, 
int sx = 0, int sy = 0 );
        //平铺pixmap

void QPainter::translate ( qreal dx, qreal dy );
        //将坐标(dx,dy)设置显示原点

void  scale ( qreal sx, qreal sy )
       //设置图片缩放,sx(横坐标放大系数),sy(纵坐标放大系数)

void  rotate ( qreal angle );  //旋转绘画区域(比如斜文本),angle=90,则表示90度
        //以时针方向旋转(顺时针)

rotate()函数分析

如果没有通过translate()设置中心原点,则默认将图片以(0,该图片的高)为原点

示例1-未设置原点中心时

   QPainter painter(this);

    for(int i=0;i<10;i++)
     {
        painter.save();
        painter.rotate(i*10);
        painter.drawText(100,100,"123");
        painter.restore();
    }

如上图,可以看到原点位于窗口最左侧. ,并且高度等于最右边位置

示例2-设置原点中心后:

    static int rotate = 0;
    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing,true);

    painter.translate(width()/2,height()/2);

    painter.drawRect(-2,-2,4,4);

    painter.setFont(QFont(0,11));

    for(int i=0;i<10;i++)
    {
        painter.save();

        painter.rotate(i*36);

        painter.drawText(100,0,20,20,Qt::AlignCenter,QString("%1").arg(i));

        painter.restore();
}

效果:

从上图可以看到旋转的同时,文字也跟着倾斜了,接下来,我们来自己写个rotate()函数,不让文字倾斜

示例3-文字不倾斜旋转

/*  point: 文字所在的点
 *  from_angle : 文字所在的度数
 *  rotate : 需要旋转的角度,值为-360~360(为负数表示逆时针旋转,为正数表示顺时针旋转)
 */
QPoint Widget::CustomRotate(QPointF point,qreal from_angle,qreal rotate)
{
    qreal PI=3.141592653589;
    QPointF Tmp; 
    qreal arc = (rotate-from_angle)/180*PI;
    qreal Length = qSqrt(point.x()*point.x() +point.y()*point.y());
    Tmp.setX(Length*qCos(arc));
    Tmp.setY(Length*qSin(arc));
    return Tmp.toPoint();
}
void Widget::paintEvent(QPaintEvent *)
{
    int angle = 0;
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.translate(width()/2,height()/2);
    painter.drawRect(-2,-2,4,4);
    painter.setFont(QFont(0,11));
    QPoint point(100,0);        //从(100,0)开始填文字

    for(int i=0;i<10;i++)
    {
       painter.drawText(point.x()-10,point.y()-10,20,20,Qt::AlignCenter,QString("%1").arg(i));
       point=CustomRotate(point,angle, 36);         //以当前angle度,顺时针旋转36度
       angle -=36;                                  //更新度数,由于顺时针,所以用减
    }  
}

效果:

示例4-通过选择加载图片实现等待效果

以下面图片为例:

代码如下:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    m_rotate(false)
{
    resize(300,300);
    connect(&timer,SIGNAL(timeout()),this,SLOT(timerout()));
    timer.start(40);
}

void Widget::timerout()
{
    m_rotate =true;
    update();
}

void Widget::paintEvent(QPaintEvent *)
{
    static int rotate = 0;
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.translate(width()/2,height()/2);

    if(m_rotate)
    {
       rotate = (rotate+5)%360;
       m_rotate =false;
    }

 
    painter.rotate(rotate);
    QPixmap pix(":wait"); 
    painter.drawPixmap(-pix.width()/2,-pix.height()/2,pix);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏HenCoder

Android 开发进阶: 自定义 View 1-1 绘制基础

从今天开始,HenCoder 就正式开讲知识技能了。按照我的计划,第一季是 UI,UI 一共分为三部分:绘制、布局和触摸反馈。本期是绘制部分的第一期。绘制大概会...

1282
来自专栏从零开始学 Web 前端

从零开始学 Web 之 CSS3(五)transform

transform 字面上就是变形,改变的意思。在CSS3中transform主要包括以下几种:移动 translate,缩放scale,旋转rotate,翻转...

1342
来自专栏天天P图攻城狮

Android OpenGL开发实践 - 基于OpenGL ES 2.0的Android相机实时图片涂鸦实现思路

这篇文章将给大家讲解如何在Android系统上基于OpenGL ES 2.0来实现相机实时图片涂鸦效果,所涂内容跟随人脸出现、消失、移动、旋转及缩放,在这里,我...

1.4K13
来自专栏mySoul

css3动画

此为动画样式中的关键帧,用关键帧来控制css动画中的关键样式。相比较过渡更加的容易空值中间的部分

1274
来自专栏柠檬先生

Sass 基础(七)

Sass Maps 的函数-map-remove($map,$key),keywords($args)     map-remove($map,$key) ...

2175
来自专栏河湾欢儿的专栏

文本

font-size 文字大小 font-weight 文字加粗(bold加粗/normal正常) font-style 文字倾斜(italic倾斜/norm...

1023
来自专栏Android知识点总结

Android关于Path你所知道的和不知道的一切

2776
来自专栏Keegan小钢

Android样式的开发:shape篇

一个应用,应该保持一套统一的样式,包括Button、EditText、ProgressBar、Toast、Checkbox等各种控件的样式,还包括控件间隔、文字...

1732
来自专栏柠檬先生

css3 UI 修饰——回顾

1.box-shadow 属性向框添加一个或者多个阴影。   语法: box-shadow: h-shadow v-shadow blur spread col...

2059
来自专栏Linux驱动

30.QT-渐变之QLinearGradient、 QConicalGradient、QRadialGradient

1285

扫码关注云+社区

领取腾讯云代金券