28.QT-QPainter介绍

介绍

  • 可以在QPaintDevice类上绘制各种图形
  • QPaintDevice类表示QPainter的绘图设备(画布)
  • QpaintDevice子类有QImage、QOpenGLPaintDevice、QWidget 等
  • 所以, QPainter可以在QImageQOpenGLPaintDeviceQWidget上进行绘制图形
  • QPainter只能在类对象的paintEvent()函数中绘制图形

QPainter类的成员角色有:

  • QPen         : 用于绘制几何图形的边缘,由颜色,宽度,线风格等参数组成
  • QBrush     : 用于填充几何图形的调色板,由颜色和填充风格组成
  • QFont       : 用于文本绘制
  • QPixmap  : 绘制图片,可以加速显示,带有屏幕截图,窗口截图等支持,适合小图片
  • QImage    : 绘制图片,可以直接读取图像文件进行像素访问,适合大图片
  • QBitmap  : QPixmap的一个子类,主要用于显示单色位图
  • QPicture  : 绘图装置,用于记录和重播Qpainter的绘图指令 

具体参考: https://blog.csdn.net/cloud_castle/article/details/26256663

QPainter基础图形绘制相关函数:

绘画圆弧drawArc

QPainter painter(this);

painter.setPen(    QPen(QColor(11,67,127),3));

QRectF rect(40.0, 40.0, 100.0, 100.0);

painter.setRenderHint(QPainter:: Antialiasing, true);  //设置渲染,启动反锯齿

painter.drawArc(rect,30*16,150*16); //绘画角度为30°~(30+150°)

painter.drawPoint(40+50,40+50);     //绘制中心点

绘画椭圆drawElipse

QPainter painter(this);

painter.setRenderHint(QPainter:: Antialiasing, true);  //设置渲染,启动反锯齿

painter.setPen( QPen(QColor(11,67,127),3));

painter.drawEllipse(40.0, 40.0, 100.0, 100.0);   //半径为50的圆

绘画扇形drawPie

QPainter painter(this);
painter.setPen(QPen(QColor(11,67,127),3));

QRectF rect(40.0, 40.0, 100.0, 100.0);

painter.setRenderHint(QPainter:: Antialiasing, true);  //设置渲染,启动反锯齿

painter.drawPie(rect,30*16,150*16); //绘画角度为30°~(30+150°)

绘画弦drawChord

QPainter painter(this);

painter.setPen(QPen(QColor(11,67,127),3));

QRectF rect(40.0, 40.0, 100.0, 100.0);

painter.setRenderHint(QPainter:: Antialiasing, true);  //设置渲染,启动反锯齿

painter.drawChord(rect,30*16,150*16);       //绘画角度为30°~(30+150°)

QPainter-视口/窗口

在Qt中, QPainter可以通过视口和窗口来设置自身组件大小位置.

视口:  基于QPaintDevice类组件的坐标实现的,属于物理坐标,通过setViewport成员函数设置

窗口:  基于自身的逻辑坐标实现的,并不是真实坐标,可以通过setWindow成员函数设置

需要注意的是:

  • Qpainter的坐标是使用的窗口坐标(逻辑坐标)
  • 当QPainter初始化时,视口和窗口坐标默认是相同的,也就是说原点(0,0)在于窗口左上角
  • 所以视口和窗口的最小坐标和最大坐标是从左上到右下的.

示例1-设置原点(0,0)为窗口的(100,100),设置绘画区域为窗口大小为100*100

如下图所示,其中蓝色为视口坐标,红色为窗口坐标:

由于数学Y坐标方向与屏幕Y坐标方向是相反的,所以w保持不变,h = -height

所以对应代码为:

    QPainter painter(this);

    QSize ViewWH(100,100);        //定义视口宽高

    painter.setViewport(50,50,ViewWH.width(),ViewWH.height());

    painter.setWindow(-50,50,ViewWH.width(),-ViewWH.height());

    painter.setBrush(QColor(187,229,253));

    painter.setPen(QPen(QColor(11,67,127),2));   

    painter.drawRect(-50,50,ViewWH.width(),-ViewWH.height()); //窗口背景

    painter.drawLine(-50,0,50,0);       //画X坐标

painter.drawLine(0,-50,0,50);           //画Y坐标 

效果如下:

示例2-在窗口的中心处绘制正弦波

QPainter painter(this);

painter.setViewport(50,50,width()-100,height()-100);    //设置视口为中心处

painter.setWindow(-10,4,20,-8);
                //定义窗口 左上角为(-10,4) 右下角为(10,-4)

painter.fillRect(-10,4,20,-8,Qt::black);

painter.setPen(QPen(QBrush(Qt::green),1/(width()-100)/20));
      //由于当前窗口和视口的比例为 width()-100 : 20
      //所以1px的横纵Line线宽 = 1/(width()-100)/20

painter.drawLine(-10,0,10,0);

painter.setPen(QPen(QBrush(Qt::green),1/(height()-100)/8));

painter.drawLine(0,-4,0,4);

for(float x=-10;x<10;x+=0.01)
{
        float y= qSin(x);
        painter.drawPoint(QPointF(x,y));
        qDebug()<<x <<","<<y;
}

效果如下:

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

JSONP挖掘与高级利用

0x00 参考资料 利用JSONP进行水坑攻击 - 乌云知识库 JSONP 安全攻防技术 - 知道创宇 0x01 漏洞之我见 这里不多说JSONP的介绍等,大家...

30710
来自专栏腾讯Bugly的专栏

WebVR如此近 - three.js的WebVR示例程序解析

关于WebVR 最近VR的发展十分吸引人们的眼球,很多同学应该也心痒痒的想体验VR设备,然而现在的专业硬件价格还比较高,入手一个估计就要吃土了。但是,对于我们...

3358
来自专栏腾讯移动品质中心TMQ的专栏

VR中的动画就是这么玩哒

导读 大家是不是觉得VR中的动画特别神奇,其实它是基于Unity中的动画系统Mecanim实现的,Unity在5.0之后,Mecanim动画控制越来越强大好用...

2146
来自专栏我和未来有约会

用silverlight做动画-相机

用silverlight做动画-相机 适合初学者学习 做一个相机的动画 和做flash动画一样,准备好素材 将素材放入项目中 开始正式制作前为了方便以后重用,...

2704
来自专栏阿凯的Excel

巧妙设置目标红线(Excel绘制图表系列课程)

应朋友要求,让我分享几期Excel的图表绘制,其实内心是拒绝的。 为啥尼,因为讲图表绘制的截图要很多很多,不过看在他说有好处的份上,我就无节操的分享几期。 ...

2654
来自专栏技术/开源

【开源】XPShadow, 用阴影让UWP更有层次感

UWP采用的是纯扁平化的设计,个人感觉极端了点,整个世界都是平的,导致App分不清层次,看不出重点。其实扁平化是趋势,android, ios都在搞,问题是an...

17110
来自专栏Crossin的编程教室

如何直观地理解程序的运行过程?

了解代码的执行过程是编程的基本要求。一个熟练的编程老手只需要用肉眼看着代码,就能对其运行的过程有所了解。然而对于刚接触编程不久的新手来说,这种事情就没那么显而易...

2454
来自专栏吾爱乐享

php学习之html的标签属性(三)

972
来自专栏java学习

Servlet实现一个简单的登录【验证码】功能

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Ajax知识点视频更新了!(回复【学习视频】获取下载链接) ●【新】HTML5知识点视频更新了!(回复【前...

2646
来自专栏GIS讲堂

wms常用操作

自从换了工作就很少有时间上网了,新的单位不让上网的,所以博客也有好久没有更新了,虽然博文的质量一般般吧,但是觉得还是坚持写下去比较好,今天,北京,雨天,写点最近...

984

扫码关注云+社区