【Qt】2D基本绘图操作——QPainter执行绘制及绘图设备介绍
文章目录
- QPainter绘图
- 绘图设备
- QPixmap
- QImage
- QPicture
Qt实现2D绘图主要基于QPainter、QPaintDevice、QPaintEngine三个类,- —
- QPainter用来执行绘图操作。
- QPaintDevice提供绘图设备,是一个二维空间的抽线,可以用QPainter在绘图设备上进行绘制,是所有可以进行绘制的对象的基类,子类主要有:QWidget、QPixmap、QPicture、QImage、QPrinter和QOpenGLPaintDevice等。
- QPaintEngine提供一些接口用于QPainter和QPaintDevice内部,使QPainter可以在不同的设备上进行绘制,除了创建自定义的绘图设备类型外,一般不需要使用到QPaintEngine。
QPainter绘图
绘图由QPainter完成具体的操作,可以绘制一切想要的图形,比如线条、矩形、圆乃至更复杂的图形,还可以绘制文本和图片。
绘图操作一般是在一个部件中的重绘事件的处理函数paintEvent()
中进行绘制。
在paintEvent()
函数中首先要创建QPainter对象,然后使用该对象进行图形的绘制,最后销毁QPainter对象。
具体实现操作如下:
重写绘图事件
paintEvent()
;在绘图事件中声明画家对象
QPainter painter(this);
,this表示在当前部件上绘图,如果不指定this,可以使用QPainter::begin(this)和QPainter::end()两个函数,绘制函数在两个函数中间调用,也表示在当前部件上绘制;使用
QPainter::draw*
函数可以绘制线条、矩形、圆、文字等;使用
QPainter::setPen()
可以设置画笔;使用
QPainter::setBrush()
可以设置画刷;还可以使用QGradient
类和QBrush
类一起实现渐变填充,Qt支持的渐变填充有:- 线性渐变
QLinearGradient
; - 辐射渐变
QRadialGradient
; - 锥形渐变
ConicalGradient
;
线性渐变参考代码:
void Widget::paintEvent(QPaintEvent *event) {QPainter painter(this); // 在当前widget窗口中绘画,指定绘图设备// 设置渐变填充QLinearGradient linearGradient(QPointF(40,190),QPointF(70,190));// 设置渐变填充的颜色linearGradient.setColorAt(0,Qt::red);linearGradient.setColorAt(0.5,Qt::cyan);linearGradient.setColorAt(1,Qt::green);// 指定渐变区域以外的区域的扩散方式linearGradient.setSpread(QGradient::RepeatSpread);// 设置画刷为渐变类型painter.setBrush(linearGradient);painter.drawRect(QRect(QPoint(20,20),QPoint(200,200))); }
- 线性渐变
绘制基本图形示例代码:
void Widget::paintEvent(QPaintEvent *event)
{// 实例化画家类QPainter painter(this); // 在当前widget窗口中绘画,指定绘图设备QPen pen(QColor(45,150,56));pen.setWidth(3); // 设置画笔宽度pen.setStyle(Qt::DotLine);painter.setPen(pen); // 设置画笔颜色// 画刷设置填充色,封闭图形会填充QBrush brush(Qt::darkGray);brush.setStyle(Qt::Dense7Pattern);painter.setBrush(brush);painter.drawLine(0,0,100,100); // 划线painter.drawEllipse(QPoint(100,100),50,50);painter.drawRect(QRect(QPoint(20,20),QPoint(200,200)));}
QPainter
高级绘图方法:
QPainter::setRenderHint()
可以设置绘制的图形是抗锯齿能力;QPainter::translate()
移动QPainter
对象;QPainter::save()
保存QPainter
对象的状态;QPainter::restore()
还原QPainter
对象的状态发生重绘的条件:
手动调用绘图事件可以使用**
update()
**或repaint()
进行重绘,repaint()
会立即进行重绘操作,参考代码:// 点击移动按钮,移动图片connect(ui->pushButton,&QPushButton::clicked,this,[=](){// 手动调用重绘图形事件,调用update()更新update();});
被隐藏的部件被重新调用;
其它一些原因;
QPainter
提供了复合模式来完成数字图像的混合,即如何将源图像的像素和目标图像的像素进行合并,通过调用QPainter::setCompositionMode()
实现,通过传递的函数参数确定不同的混合类型。
绘图设备
绘图设备是指继承QPainterDevice
的子类。Qt提供了这样的类,分别是QPixmap
、QBitmap
、QImage
、QPicture
。
QPixmap
为图像在屏幕上的显示做了优化;QBitmap
是QPixmap
的子类,色深限定为1,可以使用QPixmap::isBitmap()
确定一个QPixmap
对象是不是一个QPixmap
。QImage
为图像的像素级访问做了优化;QPicture
可以记录和重现QPainter
的各条命令;
还可以使用
QImageReader
类从文件或其它设备中读取图像,该类提供了一个格式无关的接口,该类依赖于图像底层的支持,类中的一些操作可以节省内存和加快图像的读取;使用QImageWrite
类存储图像。
QPixmap
// Pixmap绘图设备,为平台做显示的优化QPixmap pixmap(400,300);// 填充背景色pixmap.fill(Qt::white);QPainter painter(&pixmap);painter.setPen(QPen(Qt::green)); // 设置画笔painter.drawEllipse(QPoint(100,100),50,50);// 保存图片pixmap.save("D:\\pix.png");
QImage
// QImage绘图设备,可以对像素进行访问QImage image(600,400,QImage::Format::Format_RGB32);image.fill(Qt::white); // 填充背景色QPainter painter(&image);painter.setPen(QPen(Qt::blue)); // 设置画笔painter.drawEllipse(QPoint(100,100),50,50);
可以在painteEvent()
中对像素值进行修改,示例:
void Widget::paintEvent(QPaintEvent *event)
{// 使用QImage对像素进行修改QImage image;image.load(":/images/phone");QPainter painter(this);// 修改像素值for(int i=20;i<100;++i){for(int j=20;j<100;++j){QRgb value = qRgb(0,0,255);image.setPixel(j,i,value);}}painter.drawImage(10,10,image);
}
QPicture
记录和重现绘图指令
// QPicture绘图设备,可以记录和重设绘图指令QPicture pic;QPainter painter;painter.begin(&pic); // 开始在pic上绘图painter.setPen(QPen(Qt::red)); // 设置画笔painter.drawEllipse(QPoint(200,200),100,100);painter.end(); // 结束绘图pic.save("D:\\pic"); // 记录了上面的绘图指令,后缀可以随意,甚至没有后缀// 重现绘图指令QPicture pic;pic.load("D:\\pic");QPainter painter(this);painter.drawPicture(0,0,pic);
【Qt】2D基本绘图操作——QPainter执行绘制及绘图设备介绍相关推荐
- android编程绘图,Android编程绘图操作之弧形绘制方法示例
本文实例讲述了Android编程绘图操作之弧形绘制方法.分享给大家供大家参考,具体如下: /** * 绘制弧形图案 * @description: * @author ldm * @date 2016 ...
- Qt项目中,用QPainter进行绘制图形时,边角显示不完整问题的梳理
总第42篇 本文主要梳理总结了我自己在项目开发过程中经常遇到的一个问题,就是用QPainter进行图形绘制时,边角显示不完整的现象.这个问题虽然比较简单,但是很容易忘记,每次绘图时都要调试一下,故总结 ...
- 关于QPainter无法绘制问题
今天使用了QPainter绘制背景以及窗体上的控件 但是所有语法都正确,资源路径也对,程序也没有报错,也是写在paintevent里的,但是就是不见影,这是怎么回事呢 看下原来的代码 QPainter ...
- matlab 实验6 高层绘图操作,实验06_高层绘图操作(第5章).doc
实验06 高层绘图操作 (第5章 MATLAB绘图) 一.实验目的 1. 掌握绘制二维图形的常用函数. 2. 掌握绘制三维图形的常用函数. 3. 掌握绘制图形的辅助操作. 二.实验内容 1. 绘制函数 ...
- matlab 实验6 高层绘图操作,实验六 高层绘图操作答案
实验六 高层绘图操作答案 实验六 高层绘图操作 实验目的: 1. 掌握绘制二维图形的常用函数 2. 掌握绘制三维图形的常用函数 3. 掌握绘制图形的辅助操作 实验内容: 1. 1. 设,在区间取101 ...
- [Qt教程] 第11篇 2D绘图(一)绘制简单图形
[Qt教程] 第11篇 2D绘图(一)绘制简单图形 楼主 发表于 2013-4-23 12:52:35 | 查看: 1398| 回复: 5 绘制简单图形 版权声明 该文章原创于Qter开源社区,作者 ...
- 【Qt入门第11篇】 2D绘图(一)绘制简单图形
导语 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.其中QPainter用来执 ...
- [Qt教程] 第15篇 2D绘图(五)绘制图片
[Qt教程] 第15篇 2D绘图(五)绘制图片 楼主 发表于 2013-5-2 17:59:00 | 查看: 886| 回复: 3 绘制图片 版权声明 该文章原创于Qter开源社区(www.qter ...
- [Qt教程] 第14篇 2D绘图(四)绘制路径
[Qt教程] 第14篇 2D绘图(四)绘制路径 楼主 发表于 2013-4-27 12:40:52 | 查看: 611| 回复: 0 绘制路径 版权声明 该文章原创于Qter开源社区(www.qte ...
最新文章
- 【Shell脚本】颜色显示
- gitlab10.x迁移_1.x到2.x的迁移:可观察与可观察:RxJava FAQ
- 矩阵论-范数理论及其应用
- mysql慢sql增加读写分离_MySQL主从同步+读写分离
- xposed hook java_[原创]Android Hook 系列教程(一) Xposed Hook 原理分析
- php 魔术方法使用说明详细
- [转]supervisor 安装、配置、常用命令
- docker基础容器中bash: vi: command not found问题解决
- Git(6)-- 记录每次更新到仓库图文版(git clone、status、add、diff、commit、rm、mv命令详解)
- Flex 与.net 进行通信可以通过Fluorine(fluorinefx),WebORB For .net,Socket
- 全网首发:编译链接错误:对‘vtable for xxxx’未定义的引用
- SD五一联赛(加权并查集)
- 肺腑之言-写给喜欢单片机的初学者
- mysql geometry索引_Geometry——主流数据库空间索引技术
- 高中英语单词名词分类
- 网站站长统计分析CNZZ
- 数据挖掘-贡献度分析
- Linux移植Windows摄像头驱动,基于3.14内核usb摄像头驱动的移植
- 【HEOI2013】bzoj3168 钙铁锌硒维生素
- python导入文件方法大全