介绍

  • 可以在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;
}

效果如下:

Qpainter通过drawText来绘制文本

绘制文本时,是以左下角为原点开始的.
可以通过QfontMetrics获取字符串在指定字体下的宽度和高度.
示例:

void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QFont font;
font.setPixelSize(24); //设置字体像素大小为12
QString text="1234567"; //设置显示的文本
QFontMetrics metrics(font);
int w=metrics.width(text); //获取显示文本的宽度
int h=metrics.height(); //获取显示文本的高度
painter.setFont(font);
painter.setPen(Qt::blue);
painter.drawText(QRect(width()/2-w,height()/2-h,w,h),text);
painter.drawRect(QRect(width()/2-w,height()/2-h,w,h));
qDebug()<<"w:"<<w; //一个字符大小为12*24,所以宽度为12*7
qDebug()<<"h:"<<h; //高度为24
}

效果:

未完,下章学习: 30.QT-渐变之QLinearGradient、 QConicalGradient、QRadialGradient

28.QT-QPainter介绍相关推荐

  1. QT Creator介绍

    文章目录 1 QT Creator介绍 1.1 QT Creator 1.2 QT Creator中调试的基本方法 2 Qt Creator工程管理 2.1 Qt Creator工程管理简介 2.2 ...

  2. Qt QPainter::end: Painter ended whith 2 saced states

    在使用Qt  QPainter 的时候,有时会遇到"QPainter::end: Painter ended whith 2 saced states" 这时由于我们在使用的QPa ...

  3. Qt QPainter基本绘图

    Qt QPainter基本绘图 QPen QBrush 渐变填充 QFont 基本图形元件 QPainterPath QPainter::CompositionMode 实例1 QPainter绘图操 ...

  4. 1.4 Qt工具之Qt Linguist介绍

    转自:http://www.hellotongtong.com/Qt5base1/qtlinguist-intro.html 1.4 Qt工具之Qt Linguist介绍 ***[免费下载源码和PPT ...

  5. Qt Phonon介绍及安装

      Qt Phonon介绍及安装 目前在Qt 4.6中实现多媒体播放图形界面主要依赖于phonon框架,其实qt中还有一个Multimedia模块,帮助文档中对它的描述是:实现底层的多媒体播放功能,在 ...

  6. 4.28 poll API介绍及代码编写

    4.28 poll API介绍及代码编写 #include <poll.h> struct pollfd{int fd;//委托内核检测的文件描述符short events;//委托内核检 ...

  7. Qt / QPainter、QPen、QBrush 如何理解

    之前一直不是很理解上述三个类,直到看到了一篇博客,真的是茅塞顿开啊!下面是该博客的部分内容: 零.介绍 QPen 是画笔,用来绘制图形的轮廓线,以及定义轮廓线的颜色.样式和属性: QBrush 是画刷 ...

  8. PyQT5 之 Qt Designer 介绍与入门

    From:https://www.jianshu.com/p/5b063c5745d0 养薛定谔的猫 简书:https://www.jianshu.com/u/bf82b363ae88 Qt Desi ...

  9. Qt Assistant介绍

    简介 Qt Assistant也就是我们常说的Qt助手,是一款用于呈现在线文档的工具. 简介 一分钟学会使用 Qt参考文档 Qt Assistant详解 命令行选项 工具窗口 文档窗口 工具栏 菜单 ...

  10. Qt Linguist 介绍

    原文: https://blog.csdn.net/liang19890820/article/details/50274409 简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的 ...

最新文章

  1. 三种求全排列方式之比较
  2. 通过游戏的方式与陌生人聊天,破冰是如何做到的?
  3. 设计模式笔记十:装饰器模式
  4. springboot前台页面写Java代码,接收后台数据,SpringBoot整合Thymeleaf的使用
  5. 解决vscode中getch()函数报错。C语言。getch()的头文件。
  6. 报考南航计算机的专硕还是学硕呢?
  7. 生成翻转棋子游戏数据
  8. php 压缩动态gif,在PHP中压缩GIF图像质量?
  9. Jlink修复指南step by step指导(实践成功) 更新 适用win7-10
  10. 记一次奇怪的网络问题
  11. ubuntu安装最新的chrome浏览器
  12. Python分析抖音数据,让视频爆起来!
  13. qtabwidget设置表头_Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例...
  14. 伤感 html代码,让对方瞬间心酸的文案,伤感入体,痛彻心扉!
  15. 惠州新方舟电子计算机专业学校,2020惠州顶尖的技校及排名榜
  16. location 拦截所有_拦截漂浮物浮筒
  17. 11-微信小程序商城 分类和产品 产品页面顶部切换功能(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
  18. dell服务器启动顺序如何设置_Dell PowerEdge 服务器启动指南
  19. 如何选择靠谱的网站建设服务商来建设企业官网?
  20. 中级软件设计师备考---多媒体技术

热门文章

  1. 我的2021秋招 | 互联网、银行、选调 经验分享
  2. python主动抛出异常_raise手动抛出异常的3种写法
  3. java笔试题含答案总结五
  4. 南宁供电局抄表及电量电费管理系统的开发设计
  5. java课程线上线下教学平台 ssm638
  6. Picgo的gitee图床简略设置及gitee图片仓库无法使用解决方案
  7. 数据库--交叉连接查询
  8. 软考有哪些实质性的用处?
  9. scandir 参数
  10. 第五节、AHK对话框详解