介绍

  • 可以在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(,,),));

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

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

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

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

绘画椭圆drawElipse

QPainter painter(this);

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

painter.setPen( QPen(QColor(,,),));

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

绘画扇形drawPie

QPainter painter(this);
painter.setPen(QPen(QColor(,,),)); QRectF rect(40.0, 40.0, 100.0, 100.0); painter.setRenderHint(QPainter:: Antialiasing, true); //设置渲染,启动反锯齿 painter.drawPie(rect,*,*); //绘画角度为30°~(30+150°)

绘画弦drawChord

QPainter painter(this);

painter.setPen(QPen(QColor(,,),));

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

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

painter.drawChord(rect,*,*);       //绘画角度为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(,);        //定义视口宽高

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

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

    painter.setBrush(QColor(,,));

    painter.setPen(QPen(QColor(,,),));   

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

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

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

效果如下:

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

QPainter painter(this);

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

painter.setWindow(-,,,-);
//定义窗口 左上角为(-10,4) 右下角为(10,-4) painter.fillRect(-,,,-,Qt::black); painter.setPen(QPen(QBrush(Qt::green),/(width()-)/));
//由于当前窗口和视口的比例为 width()-100 : 20
//所以1px的横纵Line线宽 = 1/(width()-100)/20 painter.drawLine(-,,,); painter.setPen(QPen(QBrush(Qt::green),/(height()-)/)); painter.drawLine(,-,,); for(float x=-;x<;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(); //设置字体像素大小为12
QString text=""; //设置显示的文本
QFontMetrics metrics(font);
int w=metrics.width(text); //获取显示文本的宽度
int h=metrics.height(); //获取显示文本的高度
painter.setFont(font);
painter.setPen(Qt::blue);
painter.drawText(QRect(width()/-w,height()/-h,w,h),text);
painter.drawRect(QRect(width()/-w,height()/-h,w,h));
qDebug()<<"w:"<<w; //一个字符大小为12*24,所以宽度为12*7
qDebug()<<"h:"<<h; //高度为24
}

效果:

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

28.QT-QPainter介绍的更多相关文章

  1. QT-第一个程序 Hello QT , 以及QT creator介绍

    第一个程序 - Hello QT 首先写main.cpp: #include <QApplication> #include <QMainWindow> #include &l ...

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

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

  3. Qt版权介绍:GPL, LGPL 以及 Commercial 授权

    http://blog.csdn.net/changsheng230/article/details/6167933 Qt版权介绍:GPL, LGPL 以及 Commercial 授权 分类: Qt ...

  4. Qt QPainter画个球啊

    Qt QPainter画个球啊 目录 Qt QPainter画个球啊 看效果 方法 代码 看效果 方法 使用绘图事件,绘制一个图形 使用定时事件,不停更新图形位置 代码 .h #pragma once ...

  5. Qt Linguist介绍

    简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具.发布者.翻译者和开发者可以使用这款工具来完成他们的任务. 发布者:承担了全面发布应用程序的责任.通常,他们协调开发者和翻 ...

  6. Qt Assistant介绍

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

  7. Qt Creator介绍

    简介 Qt Creator是使用Qt开发的IDE.Qt支持Windows.Linux/Unix.Mac OS X.Android.BlackBerry.QNX等多种平台,Qt Creator为不同平台 ...

  8. 【Qt】Qt Linguist介绍【转】

    简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具.发布者.翻译者和开发者可以使用这款工具来完成他们的任务. 发布者:承担了全面发布应用程序的责任.通常,他们协调开发者和翻 ...

  9. 【Qt】Qt Assistant介绍【转】

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

  10. 【Qt】Qt Creator介绍【转】

    简介 Qt Creator是使用Qt开发的IDE.Qt支持Windows.Linux/Unix.Mac OS X.Android.BlackBerry.QNX等多种平台,Qt Creator为不同平台 ...

随机推荐

  1. easyUI分页实现加搜索功能

    前台页面: js代码: ps:pagination为true时会在table下面加上easyUI的分页. load函数会将查询值传给datagrid并传给后台重新加载. DAO.xml为: 后台代码实 ...

  2. JAVA核心技术第一卷第三章

    JAVA中包含的数据类型:

  3. PMP:10.项目采购管理

    内容中包含 base64string 图片造成字符过多,拒绝显示

  4. Windows 10 IoT Serials 10 – 如何使用OCR引擎进行文字识别

    1. 引言 OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方 ...

  5. 双十一福利,阿里云1核2G一年最低只要99

    活动期间,新用户可任选1款购买,限购1台,拼团后团内每增加1名新购用户,全团再享10%优惠 (50%封顶),买贵返差 又是只给新用户的福利,比上次的699一年的活动要差一点.如果之前注册了没下手的用户 ...

  6. centos7使用wordpress布署网站(1)

    环境说明: 在同一台主机上实现LAMP(Linux + Apache + MariaDB + PHP)腾迅云主机CentOS 7.4.Apache .MariaDB .PHP 1.安装apache.m ...

  7. Eclipse 中 Spring 项目的 XML 配置文件报错 Referenced file contains errors

    原来运行正常的项目,突然在applicationContext.xml 文件头报错 总结一下网上的解决方案: 1.有可能网络状况不好导致 如果使用Maven构建项目,spring在加载xsd文件时总是 ...

  8. 第61节:Java中的DOM和Javascript技术

    Java中的DOM和Javascript技术 DOM是一门技术,是文档对象模型.所需的文档只有标记型文档,如我们所学的html文档(文档中的所有标签都封装成为对象了) DOM: 为Document O ...

  9. Kali学习笔记33:Linux系统缓冲区溢出实验

    之前做过一个Windows应用SLmail的缓冲区溢出的实验 这次来做一个Linux平台的缓冲区溢出实验: 缓冲区溢出是什么? 学过汇编的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序 ...

  10. 第13组_16通信3班_045_OSPFv3作业

    IPv6 路由-OSPFv3 实验目的   1. 掌握 OSPFv3 的配置方法 2. 掌握在帧中继环境下 OSPFv3 的配置方法 3. 掌握 OSPFv3 NSSA 的配置方法 4. 学会查看 O ...