QT中使用QPainter 进行自行绘图的时候,为了防止“锯齿”的出现,我们会经常使用抗锯齿属性,也叫反走样, 既:

QPainter::Antialiasing //绘图抗锯齿
QPainter::TextAntialiasing //绘制的字体抗锯齿

QT 只是和很多系统的绘图API一样,提供了抗锯齿的方法,不过抗锯齿的属性默认都是关闭的,QT也不例外。

为了直观的理解抗锯齿(反走样)的作用。我们先给出效果图:

上面的图中,黑色的字体、直线、与上面的圆,都是没有启用抗锯齿(反走样)的效果的; 下面的红色字体、直线、下面的圆都是启用了抗锯齿(反走样)之后的效果。 可以看出,两幅图的效果差别还是挺大的。

我们先来讲一下有关画法的用法

1.画文字

void drawText(const QPointF &p, const QString &s);
void drawText(const QPoint &p, const QString &s);
void drawText(int x, int y, const QString &s);
void drawText(const QPointF &p, const QString &str, int tf, int justificationPadding);
void drawText(const QRectF &r, int flags, const QString &text, QRectF *br = Q_NULLPTR);
void drawText(const QRect &r, int flags, const QString &text, QRect *br = Q_NULLPTR);
void drawText(int x, int y, int w, int h, int flags, const QString &text, QRect *br = Q_NULLPTR);
void drawText(const QRectF &r, const QString &text, const QTextOption &o = QTextOption());

可以看出,画文字,有很多种方法,但是无非就是提供文字的坐标,与文字内容。可以根据自己的场景选用不同的方法。

2.画直线

void drawLine(const QLineF &line);
void drawLine(const QLine &line);
void drawLine(int x1, int y1, int x2, int y2);
void drawLine(const QPoint &p1, const QPoint &p2);
void drawLine(const QPointF &p1, const QPointF &p2);

提供起点、终点的坐标就可以了

3.画椭圆(圆)

void drawEllipse(const QRectF &r);
void drawEllipse(const QRect &r);
void drawEllipse(int x, int y, int w, int h);
void drawEllipse(const QPointF &center, qreal rx, qreal ry);
void drawEllipse(const QPoint &center, int rx, int ry);

其实这个画椭圆的函数,需要制定椭圆所在的矩形框位置。如果指定的矩形框是正方形,画出来就是圆形,否则就是椭圆。

我们的例子中,就是在paintEvent重绘函数中,就是使用了上面三个函数,分别使用 无抗锯齿(反走样), 抗锯齿(反走样),画出了文字、直线、圆,进行对比。

void MyFrame::paintEvent(QPaintEvent *ev)
{QPainter painter(this);QBrush brush(Qt::red);QBrush brush1(Qt::green);QPen pen(brush1, 5, Qt::DashDotLine, Qt::RoundCap);/**********************未启用抗锯齿功能**************************/painter.setPen(Qt::black);//画字体painter.drawText(QRectF(20, 30, 100, 100), "这是一行文字");//画一条没有启用反锯齿的线painter.drawLine(20, 50, 400, 60);//画一个圆painter.setBrush(brush);painter.setPen(pen);painter.drawEllipse(20, 55, 150, 150);/**********************启用抗锯齿功能**************************/painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);painter.setPen(Qt::red);//画字体painter.drawText(QRectF(20, 280, 100, 100), "这是一行文字");//画一条启用反锯齿的线painter.drawLine(20, 300, 400, 310);//画一个圆painter.setPen(pen);painter.setBrush(brush);painter.drawEllipse(20, 305, 150, 150);
}

我们看到了,是怎样开启抗锯齿(反走样)功能了,就是这句话

painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

前面的 Antialiasing 是绘画普通图形启用反走样, TextAntialiasing是绘画文字反走样。

也可以使用下面的函数进行开启抗锯齿(反走样)功能。

painter.setRenderHint(QPainter::Antialiasing, true);

这里设置Antialiasing属性为true,经过这句设置,我们就打开了反走样功能。QPainter和OPengl一样,是一个状态机。因此,我们这里打开了她,之后所有的代码都是开启反走样绘制的了。若要关闭反走样功能:

painter.setRenderHint(QPainter::Antialiasing, false);

到了这里,我们就会发现,反走样的效果要比走样的好得多。那么为什么系统绘图的API(包含QT在内)为什么默认不打开反走样的呢?这是因为,反走样是一种比较复杂的算法,在一些对图像质量要求不高的应用中,是不需要进行开启反走样的。为了提高效率,一般的图形绘制,都是默认不开启反走样的。

另外一个特别重要的两个属性:画笔QPen 和 画刷 QBrush

QPen : 用于绘制轮廓线

QBrush: 用于填充

QT QPainter::antialiasing QPainter::textAntialiasing 反走样、抗锯齿探究相关推荐

  1. 图形学-反走样/抗锯齿

    1.反走样 1.1 什么是走样 在上一篇文章中,我们通过采样的方式把一个三角形变成离散的点显示在屏幕上.在采样过程中,我们会产生很多锯齿,这些锯齿的学名就叫做走样 1.2 反走样 如何消除锯齿(走样) ...

  2. GPU Gems1 - 11 阴影贴图反走样

    这章介绍了如何通过邻近百分比过滤方法(Percentage-Closer Filtering , PCF)有效减少阴影贴图的反走样,并描述了如何实现一个简化版本,并对PCF方法进行了一定改进.关于阴影 ...

  3. 抗锯齿和走样(笔记)

    Artifacts(瑕疵): 比如人眼采样频率跟不上陀螺的旋转速度,这时就有可能看到陀螺在反方向旋转 怎么做抗锯齿(滤波): 在采样之前先进行一个模糊操作,可以降低锯齿的明显程度 通过傅里叶定理:任何 ...

  4. QT学习之QPainter

    关于painter绘图 QImage是绘图设备,而QPainter则是画笔,painter(&image)的意思是将图绘制在image上进行显示. image = QImage(w, h, Q ...

  5. Unity 抗锯齿Antialiasing

    直接放到相机上用即可,可以有效降低锯齿(相对于其他插件而言),另外这个脚本跟NatCorder录制视频冲突,具体原因后续再详查. 最近突然发现PC端用Antialiasing修改窗口分辨率时会黑屏,后 ...

  6. Qt 2D绘图之二:抗锯齿渲染和坐标系统

    一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...

  7. 【Qt】2D绘图之抗锯齿渲染

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 逻辑绘图 04. 物理绘图 05. 抗锯齿绘图 06. 附录 01. 概述 本部分的内容可以在帮助文档中通过Coordin ...

  8. 计算机图形学【GAMES-101】2、光栅化(反走样、傅里叶变换、卷积)

    快速跳转: 1.矩阵变换原理Transform(旋转.位移.缩放.正交投影.透视投影) 2.光栅化(反走样.傅里叶变换.卷积) 3.着色计算(深度缓存.着色模型.着色频率) 4.纹理映射(重心坐标插值 ...

  9. 图形学基础|抗锯齿(Anti-Aliasing)

    图形学基础|抗锯齿(Anti-Aliasing) 文章目录 图形学基础|抗锯齿(Anti-Aliasing) 一.前言 二.锯齿 2.1 采样理论 2.2 分类 三.抗锯齿概述 3.1 SSAA(Su ...

最新文章

  1. Redis缓存使用技巧和设计方案
  2. 深入理解jQuery的Event机制
  3. 我的心得:数据中心运维管理(一)
  4. 关闭Apache的目录浏览功能
  5. html溢出宽度控制,html - 具有固定宽度列的HTML / CSS表(如果内容溢出,则滚动) - 堆栈内存溢出...
  6. java udp ip端口 设置_UDP端口扫描Java只找到1个开放的UDP端口
  7. Linux性能优化方向及相关工具
  8. 书单|互联网企业面试案头书之架构师篇
  9. 2019牛客多校第二场E MAZE(线段树 + 矩阵)题解
  10. Linux部分命令使用说明
  11. python 创建nc文件,包含经纬度
  12. 如何卸载twincat3_TwinCAT软件安装FAQ
  13. [Python从零到壹] 七.网络爬虫之Requests爬取豆瓣电影TOP250及CSV存储
  14. uniapp开发hbuilder连接安卓模拟器mumu
  15. 湖南师范大学学科综合评价计算机,师范类高校自主招生/综合评价相关问答,2020届参考...
  16. 周末学习总结(LIO标定+kitti数据集的使用+evo工具的使用+开源数据集+ssh的使用)
  17. C++——计算x的n次幂
  18. 新买的电脑硬盘如何分区
  19. linux的系统监视器图片_用Nvidia Jetson Nano 2GB和Python构建一个价值60美元的人脸识别系统 - 人工智能遇见磐创...
  20. antd ellipsis

热门文章

  1. 工业环网交换机案例--隧道监控系统
  2. 如何从谷歌浏览器导出需要的插件
  3. 小项目-开篇:为找工作而写
  4. 计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法
  5. Oracle11g全新讲解之用户权限管理
  6. DALL-E 人工智能的艺术家
  7. 配置了一台刻锐G18 智能告警器所碰到问题
  8. 主动式电容笔哪个牌子好?苹果平板的电容笔推荐
  9. nn.AdaptiveAvgPool2d
  10. 互联网的成本:不要低估背后的隐性成本