首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

QT QPainter::antialiasing QPainter::textAntialiasing 反走样、抗锯齿探究

  • 23-09-22 20:03
  • 4697
  • 8560
blog.csdn.net

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 ¢er, qreal rx, qreal ry);
void drawEllipse(const QPoint ¢er, 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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

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

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: 用于填充

注:本文转载自blog.csdn.net的漫步繁华街的文章"https://blog.csdn.net/xiezhongyuan07/article/details/97116491"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top