在上章和上上上章:

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 = , int sy = );
//平铺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=;i<;i++)
{
painter.save();
painter.rotate(i*);
painter.drawText(,,"");
painter.restore();
}

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

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

    static int rotate = ;
QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing,true); painter.translate(width()/,height()/); painter.drawRect(-,-,,); painter.setFont(QFont(,)); for(int i=;i<;i++)
{
painter.save(); painter.rotate(i*); painter.drawText(,,,,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)/*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 = ;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.translate(width()/,height()/);
painter.drawRect(-,-,,);
painter.setFont(QFont(,));
QPoint point(,); //从(100,0)开始填文字 for(int i=;i<;i++)
{
painter.drawText(point.x()-,point.y()-,,,Qt::AlignCenter,QString("%1").arg(i));
point=CustomRotate(point,angle, ); //以当前angle度,顺时针旋转36度
angle -=; //更新度数,由于顺时针,所以用减
}
}

效果:

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

以下面图片为例:

代码如下:

Widget::Widget(QWidget *parent) :
QWidget(parent),
m_rotate(false)
{
resize(,);
connect(&timer,SIGNAL(timeout()),this,SLOT(timerout()));
timer.start();
} void Widget::timerout()
{
m_rotate =true;
update();
} void Widget::paintEvent(QPaintEvent *)
{
static int rotate = ;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.translate(width()/,height()/); if(m_rotate)
{
rotate = (rotate+)%;
m_rotate =false;
} painter.rotate(rotate);
QPixmap pix(":wait");
painter.drawPixmap(-pix.width()/,-pix.height()/,pix);
}

有了以上知识后,接下来我们就可以制作一个表盘控件了,接下来学习:

32.QT-制作最强电压电阻表盘,可以自定义阴影效果,颜色,图标,文字标签等-附带demo程序

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

  1. iOS开发 CGAffineTransform 让图片旋转, 旋转后获得图片旋转的角度

    1.让图片旋转 UIImageView *imageView = [[UIImageView alloc]init]; imageView.frame = CGRectMake(50, 50, 200 ...

  2. jQuery旋转插件jqueryrotate 图片旋转

    "jquery.rotate.min.js"是jQuery旋转rotate插件,支持Internet Explorer 6.0+ .Firefox 2.0 .Safari 3 .O ...

  3. ios手机竖屏拍照图片旋转90°问题解决方法

    手机拍照会给图片添加一个Orientaion信息(即拍照方向),如下: 用ios手机拍照,系统会给图片加上一个方向的属性, ios相机默认的拍照方向是后摄Home键在右为正,前摄Home键在左为正. ...

  4. js实现图片旋转、模板文件查看图片大图之记录篇[二]

    一个小小的前端需求送给大家,使用js实现图片旋转,并且点击图片能够实现规定格式的大图. 主要使用的是jQuery的delegate()方法实现图片旋转,该方法主要的功能就是给某个组件绑定一个或一组事件 ...

  5. 基于HTML5+CSS3的图片旋转、无限滚动、文字跳动特效

    本文分享几种基于HTML5+CSS3实现的一些动画特效:图片旋转.无限滚动.文字跳动;实现起来均比较容易,动手来试试! 一.图片旋转 效果图如下: 这个效果实现起来其实并不困难.代码清单如下: < ...

  6. moviepy音视频剪辑:使用rotate函数实现视频变换处理以及参数expand取值为True时的花屏问题解决方案

    ☞ ░ 前往老猿Python博文目录 ░ 一.rotate函数功能介绍 moviepy的rotate函数用于将剪辑逆时针旋转指定的角度或弧度. 调用语法:rotate(clip, angle, uni ...

  7. split(),preg_split()与explode()函数分析与介

    split(),preg_split()与explode()函数分析与介 发布时间:2013-06-01 18:32:45   来源:尔玉毕业设计   评论:0 点击:965 split()函数可以实 ...

  8. string函数分析

    string函数分析string函数包含在string.c文件中,经常被C文件使用.1. strcpy函数原型: char* strcpy(char* str1,char* str2);函数功能: 把 ...

  9. start_amboot()函数分析

    一.整体流程 start_amboot()函数是执行完start.S汇编文件后第一个C语言函数,完成的功能自然还是初始化的工作 . 1.全局变量指针r8设定,以及全局变量区清零 2.执行一些类初始化函 ...

随机推荐

  1. Android 自定义 View 绘制

    在 Android 自定义View 里面,介绍了自定义的View的基本概念.同时在 Android 控件架构及View.ViewGroup的测量 里面介绍了 Android 的坐标系 View.Vie ...

  2. Java核心技术卷一基础知识-第14章-多线程-读书笔记

    第 14 章 多线程 本章内容: * 什么是线程 * 中断线程 * 线程状态 * 线程属性 * 同步 * 阻塞队列 * 线程安全的集合 * Collable与Future * 执行器 * 同步器 * ...

  3. 吴恩达机器学习笔记42-大边界的直观理解(Large Margin Intuition)

    这是我的支持向量机模型的代价函数,在左边这里我画出了关于

  4. Spring Boot 2.1.0 已发布,7 个重大更新!

    距离<重磅:Spring Boot 2.0 正式发布!>已经过去大半年了,而 Spring Boot 2.1.0 在 10 月底就发布了,我们来看下 Spring Boot 2.1.0 都 ...

  5. 【spring】从简单配置使用到深入

    一.使用前的配置 1.maven引入需要的jar包 <properties> <spring.version>4.1.6.RELEASE</spring.version& ...

  6. react native项目启动需要做的操作

    一.启动: 1.查看端口(默认8081是否被占用) netstat -ano   可以查看所有的进程 2.netstat -ano | findstr "8081"  查看某个端口 ...

  7. python之找最后一个人

    题目大概是:有10个人围成一圈,从第一个人数,数到3的人出局,问最后一个人是谁? 围成一圈,那就是无限循环,直至最后一个人,我们可以把10个人看做一个列表,每循环一次就把除3为0的数去除,下次再次循环 ...

  8. ML - 特征选择

    1. 决策树中的特征选择 分类决策树是一种描述对实例进行分类的树型结构,决策树学习本质上就是从训练数据集中归纳出一组分类规则,而二叉决策树类似于if-else规则.决策树的构建也是非常的简单,首先依据 ...

  9. [Jenkins]Jenkins构建时提示java.io.IOException: No space left on device

    突然发现Jenkins的Job全部都停了,打开Jenkins发现所有的slave机器,均提示: 点开Dead(!),提示Thread has died,如下图: 看图好像说是Jenkins所在的服务器 ...

  10. 减少重复代码的书写--Lombok

    本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 在开发中,比如我们要写一个modol 实体类 要编写 get.set 这些获取和填值的方法,这样写也没错 ...