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

news2024/11/16 23:45:35

前言

前段时间遇到这样一个问题,使用QPainter绘制直线的时候,设置了笔宽为1像素,但是绘制出来的线条却是2px宽度,而且设置的画笔颜色很明显是降低了透明度,不是最“纯正”的颜色。
当时就感觉非常奇怪,明明设置的画笔宽度是正常的,为啥绘制出来不是自己想要的样子。而且,当画笔宽度设置为2px后,发现结果又是正常的,透明度也是正常。
后来一句句的代码排查问题才发现了其中的猫腻。
先来看看这个现象,为了演示效果,分别绘制了1px和2px时是的直线和矩形:
在这里插入图片描述
上面是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);
}

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

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

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

so,当我们只需要绘制直线或者矩形或者不带圆角和弧度的图形时,其实不需要设置渲染器效果,这样在绘制1px宽度的情况下能保持想要的效果~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FPGA实验1】FPGA点灯工程师养成记

对于FPGA几个与LED相关的实验(包括按键点灯、流水灯、呼吸灯等)的记录,方便日后查看。这世界上就又多了一个FPGA点灯工程师了😏 成为一个FPGA点灯工程师分三步:一、按键点灯1、按键点灯程序2、硬件实现二、流水灯1、流…

Vue2-黑马(二)

目录: (1)vue2-基础-属性绑定 (2)vue2-事件绑定 (3)vue2-双向绑定 (4)vue2-计算属性 (1)vue2-基础-属性绑定 属性与js数据绑定: …

react-router原理

前端路由的原理 自己来监听URL的改变,改变url,渲染不同的组件(页面),但是页面不要进行强制刷新(a元素不行)。 hash模式,localhost:3000/#/abc 优势就是兼容性更好,在老版IE中都可以运行缺点是…

DNS配置

TCP/IP提供了通过IP地址来连接到设备的功能,但对用户来讲,记住某台设备的IP地址是相当困难的,因此专门设计了一种字符串形式的主机命名机制,这些主机名与IP地址相对应。 在IP地址与主机名之间需要有一种转换和查询机制&#xff0c…

CANopen | 对象字典OD 06 - 创建对象字典变量,通过TPDO定时发送

文章目录一、前言二、实验目的三、对象字典OD四、TPDO1定时发送tx_Value变量一、前言 该笔记的程序: github 二、实验目的 CANopen从站有一个变量tx_Value,映射到TPDO1上。接着,CANopen从站每1S发送一次TPDO1,将tx_Value发送出去。 三、…

PasteSpider之文件同步软件的介绍

作为PasteSpider系统中的一大特色,那就是文件的差量同步和配置同步。能够实现对不同需求的良好实现。 在网站https://www.pastecode.cn/下载文件同步软件后,完全解压到自己的文件夹内,然后双击“SpiderSyncFile”,如下图: 打开登陆…

Nginx模板自动化

背景 在日常工作中,我们经常需要创建Nginx配置文件的模板,以便在不同的环境中快速部署和配置Nginx服务器。然而,这样的任务通常需要重复性高、耗时长,且容易出错。为了加快这些任务的完成,并提高工作效率,…

C/C++开发,认识opencv各模块

目录 一、opencv模块总述 二、opencv主要模块 2.1 opencv安装路径及内容 2.2 opencv模块头文件说明 2.3 成熟OpenCV主要模块 2.4 社区支持的opencv_contrib扩展主要模块 2.5 关于库文件的引用 一、opencv模块总述 opencv的主要能力在于图像处理,尤其是针对二维图…

字节8年测试经验,送给想要学习自动化测试的同学6条建议

我的职业生涯开始和大多数测试人一样,开始接触都是纯功能界面测试。那时候在一家电商公司做测试,做了有一段时间,熟悉产品的业务流程以及熟练测试工作流程规范之后,效率提高了,工作比较轻松,也得到了更好的…

QML控件--Dial

文章目录一、控件基本信息二、控件使用三、属性成员四、成员函数五、信号一、控件基本信息 Import Statement:import QtQuick.Controls 2.14 Since:Qt 5.7 Inherits:Control 二、控件使用 Dial:是一个旋钮控件; im…

【权限维持】黄金白银票据隐藏账户C2远控RustDeskGotoHTTP

文章目录内网域&单机版-权限维持-基于用户-隐藏用户内网域-权限维持-基于服务TGT-黄金白银票据黄金方法:白银方法:内网域-权限维持-基于软件-GotoHTTP&RustDesk—无需安装C2 GotoHTTPC2 RustDesk 推荐内网域&单机版-权限维持-基于用户-隐藏用…

Plist文件是什么?

plist 文件是一种用于存储应用程序配置信息的文件格式,其中包含应用程序的各种设置和数据。在过去,plist 文件通常是以.plist 格式存储的。然而,随着时间的推移,人们开始使用.plistx 格式来存储更复杂的数据结构和数据。如果您需要…

MySQL日期时间函数汇总、时间格式转换方法

MySQL日期时间函数汇总、时间格式转换方法时间函数日期时间格式转换date_format函数EXTRACT()DATE_ADD()DATE_SUB()DATEDIFF函数时间函数 函数描述NOW()返回当前的日期和时间CURDATE()返回当前的日期CURTIME()返回当前的时间DATE()返回日期或日期/时间表达式的日期部分HOUR()获…

【遗传算法、粒子群、改进遗传算法】基于智能算法的电力系统电网最优规划方案的研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【从零开始学Skynet】工具篇(一):Ubuntu16.04环境搭建

一、Ubuntu系统下载 为了初学者使用方便,我们下载的是Ubuntu16系统的桌面版本:下载地址 二、VirtualBox虚拟机下载 去Virtualbox官网下载:Downloads – Oracle VM VirtualBox 点击这里进行下载,下载完之后点击客户端进行安装,安装…

ros2-foxy windows下安装流程

1.系统要求 本手册安装环境为win10 x64 请确保已在系统路径中安装PowerShell。 请确保网络的通畅性 2.环境安装部分 安装Chocolatey 方案1: 复制以下命令行,使用管理员权限打开PowerShell,复制粘贴大法到PowerShell,安装好ch…

YC-A11(原创)基于springboot,vue网上商城

绪论 课题的开发背景 随着计算机和网络的快速发展,并且越来越普及,互联网日益成为人们收集信息常用渠道,电子商务开始流行,一种全新的理念不断形成并且快速发展,像国内电商巨头淘宝、京东、苏宁易购、唯品会等电商平台…

筑牢合规营销“防火墙”,助力四环医药实现合规营销管理能力全面进阶 | 案例研究

四环医药控股集团有限公司(以下简称“四环医药”)是一家集药品研发、生产和销售于一体的集团化医药企业,公司现拥有心脑血管疾病、肝病治疗、提高机体免疫机能、代谢及抗感染等多领域100品种。四环医药强大的营销体系及独特营销模式确保了自身…

会画画的海龟,Python Turtle库详解(27)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 介绍下Python的turtle库,这是一个可以画画的库,非常适合小孩子在屏幕上画画。 先学习基础知…

Python入门教程+项目实战-9.4节: 字符串的格式化

目录 9.4.1 理解格式化 9.4.2 使用f-string进行格式化 9.4.3 使用格式化符号进行格式化 9.4.4 使用format方法进行格式化 9.4.5 知识要点 9.4.6 系统学习python 9.4.1 理解格式化 同学们比较熟悉的是磁盘格式化,将磁盘格式化以后,磁盘中的文件全部…