Qt关于QPainter绘制1px宽度图形带来的问题思考

这篇具有很好参考价值的文章主要介绍了Qt关于QPainter绘制1px宽度图形带来的问题思考。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

前段时间遇到这样一个问题,使用QPainter绘制直线的时候,设置了笔宽为1像素,但是绘制出来的线条却是2px宽度,而且设置的画笔颜色很明显是降低了透明度,不是最“纯正”的颜色。
当时就感觉非常奇怪,明明设置的画笔宽度是正常的,为啥绘制出来不是自己想要的样子。而且,当画笔宽度设置为2px后,发现结果又是正常的,透明度也是正常。
后来一句句的代码排查问题才发现了其中的猫腻。
先来看看这个现象,为了演示效果,分别绘制了1px和2px时是的直线和矩形:
Qt关于QPainter绘制1px宽度图形带来的问题思考
上面是1px效果,下面是2px效果,颜色设置都是一样的,可以很明显的看到上面绘制的图形效果也是2px,而且透明度降低了。

ok,带着问题,进入今天的主题。

正文

先说结论,为什么会导致上面的现象。
是因为设置了painter渲染器,painter.setRenderHint(QPainter::Antialiasing,true);

为了验证和对比效果,绘制了四组图形,分别是1px和2px,然后设置了渲染器和不设置渲染器。

上代码:

void Widget::paintEvent(QPaintEvent *e)
{
    QPainter painter(this);

    painter.fillRect(this->rect(),Qt::black);

    painter.setBrush(Qt::NoBrush);

    QPen pen;
    pen.setColor(Qt::red);
    pen.setWidth(1);
    painter.setPen(pen);

    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.drawLine(100,50,100,150);
    painter.drawRect(130,50,100,100);
    painter.drawRoundedRect(260,50,110,100,20,20);

    painter.setRenderHint(QPainter::Antialiasing,false);
    painter.drawLine(400,50,400,150);
    painter.drawRect(430,50,100,100);
    painter.drawRoundedRect(560,50,110,100,20,20);


    pen.setWidth(2);
    painter.setPen(pen);

    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.drawLine(100,200,100,300);
    painter.drawRect(130,200,100,100);
    painter.drawRoundedRect(260,200,110,100,20,20);

    painter.setRenderHint(QPainter::Antialiasing,false);
    painter.drawLine(400,200,400,300);
    painter.drawRect(430,200,100,100);
    painter.drawRoundedRect(560,200,110,100,20,20);
    
    QWidget::paintEvent(e);
}

看效果:
Qt关于QPainter绘制1px宽度图形带来的问题思考
上面一排是1px,下面一排是2px,左边是设置了RenderHint,右边没有设置。
可以看出来设置渲染器后绘制的圆角更加平滑,而没有设置的情况 圆角会带有“毛刺”,当我们需要绘制曲线或者这种类似的有弧度的图形时,添加渲染器设置会让绘制效果更加平滑一些,

而RenderHint的设置包含了很多种,分别对应不同的场景,具体可以查看Qt帮助文档。

Qt关于QPainter绘制1px宽度图形带来的问题思考
回到最开始的话题,为啥设置了渲染器后绘制1px的图形会出现上面那种情况。
猜测的原因应该是:设置painter.setRenderHint(QPainter::Antialiasing,true); 后,绘制曲线或者类似的有弧度的图形时,会将去弧度变成更加平滑,那在源码内部实现平滑效果时,应该是在图形边缘补充了一个像素的绘制,同时降低其透明度,使其锯齿处显得更加平滑,这样就可以解释为什么只绘制1px宽度时会出现看到2px宽度的效果。

so,当我们只需要绘制直线或者矩形或者不带圆角和弧度的图形时,其实不需要设置渲染器效果,这样在绘制1px宽度的情况下能保持想要的效果~文章来源地址https://www.toymoban.com/news/detail-419466.html

到了这里,关于Qt关于QPainter绘制1px宽度图形带来的问题思考的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt之QPainter绘制多个矩形/圆形(含源码+注释)

    下图绘制的是矩形对象,但是将绘制矩形函数(drawRect)更改为绘制圆形(drawEllipse)即可绘制圆形。 绘制矩形需要自然要获取矩形数据,因此通过鼠标事件获取每个矩形的rect数据(鼠标按下为起始点,鼠标释放为结束点;每次移动时的当前位置做结束点,并实时刷新,实现

    2023年04月25日
    浏览(117)
  • 《QT从基础到进阶·十五》用鼠标绘制矩形(QGraphicsView、QPainter、QGraphicsRectItem)

    以下是鼠标绘制矩形最全的一种用法,完整源码将会放在最后面。 QT版本:5.15.2 VS版本:2019 1、在界面加载一张图片 界面的搭建选用QGraphicsView,自定义类GraphicsView继承QGraphicsView,在主程序中点击按钮打开 图片,相关代码如下: 2、创建矩形绘制对象,并绘制、移动矩形 在

    2024年02月04日
    浏览(50)
  • 移动端1px-从基本原理到开源解决方案介绍

     1px 不够准确,应该说成 1  物理像素 为什么有 1px 这个问题? 实现 1px 有哪些方法?这些方法分别有哪些优缺点? 开源项目中使用的哪些解决方案? 如何在项目中处理 1px 的相关问题? 首先,我们要了解两个概念,一个是像素(pixel)可以简写为px,另外一个是设备像素比

    2024年02月07日
    浏览(35)
  • uniapp使用uni-swipe-action后右侧多了小于1px的间隙

    问题:uniapp使用uni-swipe-action后右侧多了小于1px的间隙。且在真机上没有问题,但是在微信开发者工具中有问题。 代码如下:在滑动滑块或者点击这个区域时,就会出现问题。   怀疑是,父级容器cart-box和子级uni-swipe-action宽度没有完全相等导致。而容器都没有设置固定宽度值

    2024年02月15日
    浏览(44)
  • Qt如何实现实时鼠标绘制图形

      想要实现鼠标拖拽绘图的效果,离不开鼠标的三大事件:按下、移动、释放 那么具体实现实时绘制矩形框的核心流程是什么呢? 第一步:鼠标左键点击,记录初始点击位置 第二步:在窗口中移动鼠标,实时获取鼠标拖动点,根据拖动点绘制指定形状 第三步:鼠标点击右键

    2024年02月15日
    浏览(35)
  • Qt鼠标拖动绘制基本几何图形

    用Qt鼠标事件实现基本几何图形的绘制,支持直线、矩形、圆形、椭圆。后期可以在此基础上进行扩展。 效果图 实现 本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独的对象,鼠标拖动绘制的过程是在临时层中完成,release后生成一个矢量的图

    2024年02月13日
    浏览(36)
  • Qt中QGraphicsView架构下实时鼠标绘制图形

    上一章节介绍了关于QGraphicsView的基础讲解,以及简单的类图创建,由上一章节中最后展示的动画效果来看,今年主要讲述如何在QGraphicsView架构下,实时拖动鼠标绘制图形! 今天主要以矩形为例,再来看一下展示效果吧! 想要实现鼠标拖拽绘图的效果,离不开鼠标的三大事件

    2024年01月22日
    浏览(44)
  • Qt 5.14.2插入VTK 9.0.1 窗口并绘制图形

    参考链接: VS2017配置QT环境(详细版)_vs2017 qt-CSDN博客 QT5+VTK9.1最新配置方法_qt vtk-CSDN博客 VTK笔记-Qt5.12.11编译VTK9.0.3-QVTKOpenGLNativeWidget-CSDN博客 环境: Qt 5.14.2 + VS 2017 + VTK9.0.1 安装好Qt及VS QT插件,编译VTK。 在VS2017中依次点击文件-》新建-》工程,打开新建项目页面。 这里可以设

    2024年03月09日
    浏览(39)
  • 关于图形界面Pyqt与QT的区别选择

            关于图像界面(GUI)想必大家都并不陌生,想要将一段已经完善的功能列表进行可视化操作并且具有一定的操作空间,将功能可视化必不可少,一个好的可视化工具不仅可以集成一系列小的文件功能,还能将不同方法之间的调用联系起来,形成良好的系统整理功能。

    2023年04月13日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包