Qt绘图原理详解 qt绘图教程
bigegpt 2024-12-23 08:48 5 浏览
1、Qt绘制事件
当应用程序收到绘制事件时,就会调用?QWidget::paintEvent()??,该函数就是绘制窗口的地方。
有两种方法要求重绘一个窗口
??update()?? --把重绘事件添加到事件队列中
重复调用??update()??会被Qt合并为一次
不会产生图像的闪烁
可带参数指定重绘某个区域
??repaint()?? --立即产生绘制事件
一般情况下不推荐使用此方法
只使用在需要立即重绘的特效情况下
可带参数指定重绘某个区域
为了处理绘制事件,只需要重写??paintEvent()???函数,并在该函数中实例化一个??QPainter??对象进行绘制。
class MyWidget : public QWidget
{
...
protected:
void paintEvent(QPaintEvent *);
}
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
...
}
QT开发交流+赀料君羊:714620761
基本绘制
??QPainter??类提供绘制操作,其构造函数原型为:
QPainter(QPaintDevice *device);
?QPaintDevice??代表绘制2D图像的画布;
如下继承??QPaintDevice??的类对象都可用于??QPainter??绘制
QWidget、QImage、QPixmap、QPicture、QPrinter、QSvgGenerator、
QGLPixelBuffer、QGLFrameBufferObject
2、Qt 2D绘图
QPainter
线和轮廓都可以用画笔(QPen)进行绘制,用画刷(QBrush)进行填充;
字体使用??QFont??类定义,当绘制文字时,Qt使用指定字体的属性,如果没有匹配的字体,Qt将使用最接近的字体;
通常情况下,??QPainter???以默认的坐标系统进行绘制,也可以用??QMatrix??类对坐标进行变换;
当绘制是,可以使用??QPainter::RenderHint??来告诉绘图引擎是否弃用反锯齿功能使图变得平滑;
??QPainter::RenderHint??的可取值:
??QPainter::Antialiasing??:告诉绘图引擎应该在可能的情况下进行边的反锯齿绘制
??QPainter::TextAntialiasing??:尽可能的情况下文字的反锯齿绘制
??QPainter::SmoothPixmapTransform??:使用平滑的pixmap变换算法(双线性插值算法),而不是近邻插值算法;
QPainter的绘图函数总结如下:
3、画笔
画笔的属性包括线型、线宽、颜色等。画笔属性可以在构造函数中指定,也可以使用??setStyle()???,??setWidth()???,??setBrush()???,??setCapStyle()???,??setJoinStyle()??等函数设定;
Qt中,使用Qt::PenStyle定义了6中画笔风格,分别是:
? 还可以自定义线风格(??Qt::CustomDashLine???),需要使用QPen的??setDashPattern()??函数来设定自定义风格。
端点风格(cap style)
端点风格决定了线的端点样式,只对线宽大于1的线有效。
Qt定义了三种端点风格用枚举类型??Qt::PenCapStyle??表示,分别为:
连接风格(join style)
连接风格是两条线如何连接,连接风格对线宽大于等于1的线有效;
Qt定义了四种连接方式,用枚举类型??Qt::PenStyle??表示。分别是:
4、画刷
在Qt中图形使用??QBrush??进行填充,画刷包括填充颜色和风格(填充模式)。
在Qt中,颜色使用??QColor???类表示,??QColor??支持RGB、HSV、CMYK颜色模型。QColor还支持alpha混合的轮廓和填充。
RGB是面向硬件的模型。颜色有红绿蓝三种基色混合而成。
HSV/HSL模型比较符合人对颜色的感觉,由色调(0-359),饱和度(0-255),亮度(0-255)组成,主要用于颜色选择器。
CMYK由青、洋红、黄、黑四种基色组成。主要用于打印机等硬件拷贝设备上。每个颜色分量的取值是0-255。
基本模式填充包括有各种点、线组合的模式。
QColor
??QColor???的构造函数:??QColor(int r,int g,int b,int a)??
其中 参数a(alpha)是控制透明度的,取值范围为0-255;0为完全透明,255为不透明。
颜色还可以使用如下函数进行微调
QColor::lighter(int factor)
QColor::darker(int factor)
QRgb
QRgb类可以用于保存颜色值,可与QColor相互转换获取32-bit的RGB颜色值+alpha值。
创建新颜色
QRgb orange = qRgb(255,127,0);
QRgb overlay = qRgb(255,0,0,100);
获取单独某个颜色值:qRed,qGreen,qBlue,qAlpha
int red = qRed(orange);
获取灰度值
int gray = qGray(orange);
模式画刷
模式化画刷构造函数??QBrush(const QColor *color,Qt::BrushStyle style)??,具体见下图:
5、渐变填充
Qt提供了渐变填充的画刷,渐变填充包括两个要素:颜色的变化和路径的变化
颜色变化可以指定从一种颜色渐变到另外一种颜色。
路径变化指在路径上指定一些点的颜色进行分段渐变。
Qt中,提供了三种渐变填充
线性(QLinearGradient)
圆形(QRadialGradient)
圆锥渐变(QConicalGradient)
所有的类都从QGradient类继承
构造渐变填充的画刷
QBrush b = QBrush(QRadialGradient(...));
填充设置
从图形的起点到终点,以从0至1的比例渐变填充
QGradient::setColorAt(qreal pos,QColor color);
完成0-1范围的填充后,后续颜色铺开的方式可以不同,通过??setSpread()??函数来设置
1、线性渐变填充
线性渐变填充指定两个控制点,画刷在两个控制点之间进行颜色插值。
通过创建??QLinearGradient??对象来设置画刷。
QPainter painter(this);
QLinearGradient g(0,0,100,100);
g.setColorAt(0.0,Qt::white);
g.setColorAt(1.0,Qt::blue);
painter.setBrush(g);
p.drawRect(0,0,100,100);
在??QGradient??构造函数中指定线性填充的两点分别为(0,0),(100,100)。
??setColorAt()??函数在0-1之间设置指定位置的颜色。
2、圆形渐变填充
圆形渐变填充需要指定圆心、半径和焦点
QRadialGradient(qreal cx,qreal cy,qreal radius,qreal fx,qreal fy);
画刷在焦点和圆上的所有点之间进行颜色插值。
创建??QRadialGradient??对象设置画刷
QPainter painter(this);
QRadialGradient radialGradient(50,50,50,30,30);
radialGradient.setColorAt(0.0,Qt::white);
radialGradient.setColorAt(1.0,Qt::blue);
painter.setBrush(radialGradient);
painter.drawRect(0,0,100,100);
3、圆锥渐变填充
圆锥渐变填充指定圆形和开始角
QConicalGradient(qreal cx,qreal cy,qreal angle);
画刷沿圆心逆时针对颜色进行插值
创建??QConicalGradient??对象并设置画刷
QPainter painter(this);
QConicalGradient conicalGradient(50,50,90);
conicalGradient.setColorAt(0,Qt::white);
conicalGradient.setColorAt(1,Qt::blue);
painter.setBrush(conicalGradient);
painter.drawRect(0,0,100,100);
为了实现自定义填充,还可以使用QPixmap或者QImage对象进行纹理填充。两种图像分别使用??setTexture()??和??setTextureImage()??函数加载纹理。
相关推荐
- 了解Linux目录,那你就了解了一半的Linux系统
-
大到公司或者社群再小到个人要利用Linux来开发产品的人实在是多如牛毛,每个人都用自己的标准来配置文件或者设置目录,那么未来的Linux则就是一团乱麻,也对管理造成许多麻烦。后来,就有所谓的FHS(F...
- Linux命令,这些操作要注意!(linux命令?)
-
刚玩Linux的人总觉得自己在演黑客电影,直到手滑输错命令把公司服务器删库,这才发现命令行根本不是随便乱用的,而是“生死簿”。今天直接上干货,告诉你哪些命令用好了封神!喜欢的一键三连,谢谢观众老爷!!...
- Linux 命令速查手册:这 30 个高频指令,拯救 90% 的运维小白!
-
在Linux系统的世界里,命令行是强大的武器。对于运维小白而言,掌握一些高频使用的Linux命令,能极大提升工作效率,轻松应对各种系统管理任务。今天,就为大家奉上精心整理的30个Linu...
- linux必学的60个命令(linux必学的20个命令)
-
以下是Linux必学的20个基础命令:1.cd:切换目录2.ls:列出文件和目录3.mkdir:创建目录4.rm:删除文件或目录5.cp:复制文件或目录6.mv:移动/重命名文件或目录7....
- 提高工作效率的--Linux常用命令,能够决解95%以上的问题
-
点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...
- 15 个实用 Linux 命令(linux命令用法及举例)
-
Linux命令行是系统管理员、开发者和技术爱好者的强大工具。掌握实用命令不仅能提高效率,还能解锁Linux系统的无限潜力,本文将深入介绍15个实用Linux命令。ls-列出目录内容l...
- Linux 常用命令集合(linux常用命令全集)
-
系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DM...
- Linux的常用命令就是记不住,怎么办?
-
1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...
- Linux常用文件操作命令(linux常用文件操作命令有哪些)
-
ls命令在Linux维护工作中,经常使用ls这个命令,这是最基本的命令,来写几条常用的ls命令。先来查看一下使用的ls版本#ls--versionls(GNUcoreutils)8.4...
- Linux 常用命令(linux常用命令)
-
日志排查类操作命令查看日志cat/var/log/messages、tail-fxxx.log搜索关键词grep"error"xxx.log多条件过滤`grep-E...
- 简单粗暴收藏版:Linux常用命令大汇总
-
号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友在Linux系统中,命令行界面(CLI)是管理员和开发人员最常用的工具之一。通过命令行,用户可...
- 「Linux」linux常用基本命令(linux常用基本命令和用法)
-
Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)1、显示日期的指令:d...
- Linux的常用命令就是记不住,怎么办?于是推出了这套教程
-
1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...
- Linux的30个常用命令汇总,运维大神必掌握技能!
-
以下是Linux系统中最常用的30个命令,精简版覆盖日常操作核心需求,适合快速掌握:一、文件/目录操作1.`ls`-列出目录内容`ls-l`(详细信息)|`ls-a`(显示隐藏文件)...
- Linux/Unix 系统中非常常用的命令
-
Linux/Unix系统中非常常用的命令,它们是进行文件操作、文本处理、权限管理等任务的基础。下面是对这些命令的简要说明:**文件操作类:*****`ls`(list):**列出目录内容,显...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)