Qt——2D画图

基础画图函数

矩形

painter.drawRect(50,50,200,100);

圆角矩形

painter.drawRoundRect(50,50,200,200,50,50);

xRadius和yRadius分别以矩形宽度和高度的一半的百分比指定,并且应该在0.0到100.0的范围内

弧线

painter.drawArc(50,50,200,200, -90*16, 90*16);

水平向右为0度,顺时针spanAngle为正

startAngle和spanAngle精度为1/16度,

painter.drawChord(350,50,200,200, -90*16, 90*16);

同上,startAngle和spanAngle精度为1/16度,会把弧也画出来

扇形

painter.drawPie(350,50,200,200, -90*16, 90*16);

路径 QPainterPath 类

QPainterPath 类是一个容器,可把图形形状保存其中,需要时可再次使用,也就是说,复
杂的图形只需要使用路径创建一次,然后就可以调用 QPainter::drawPath()函数多次绘制它

步骤 :

1)、创建 QPaiterPath 对象。 

2)、使用 moveTo 把当前点移至需要绘制图形的开始位置 

3)、使用 lintTo()、arcTo()等函数绘制直线、弧等图形,还可使用 addRect()、addEllipse()
等函数把封闭子路径添加到路径。 

4)、使用 QPainter::drawPath()函数绘制路径所描述的图形。

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QPainterPath pa1;pa1.moveTo(width()/2,height()/2);pa1.arcTo(0,0,width(),height(), -90, 90);painter.drawPath(pa1);
}

与上面不同的是 pa1.arcTo(0,0,width(),height(), -90, 90);这里的 startAngle, arcLength精度是1度

QPainterPath 填充

即使绘制的路径不是封闭的,也会被视为是隐式关闭的,因此可被填充

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QBrush bs(QColor(1,188,1));painter.setBrush(bs);QPainterPath pa1;pa1.moveTo(width()/2,height()/2);pa1.arcTo(0,0,width(),height(), -90, 90);painter.drawPath(pa1);
}

图形的交、并、补

Qt绘制图形的交、并、补_qt 图形 交点-CSDN博客

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);//创建画笔//设置绘制样式painter.setPen(QPen(QColor(0,255,0,0)));//描边颜色painter.setBrush(QBrush(Qt::red));//填充颜色(不设置就只是线)//路径QPainterPath pa1 ,pa2;QPolygonF f1,f2;pa1.addEllipse(100,100,250,250);pa2.addEllipse(200,200,250,250);//路径转多边形f1 = pa1.toFillPolygon();f2 = pa2.toFillPolygon();//交并补QPolygonF un = f1.united(f2);//并//绘制painter.drawPolygon(un);QPainterPath pa3 ,pa4;QPolygonF f3,f4;pa3.addEllipse(600,100,250,250);pa4.addEllipse(700,200,250,250);//路径转多边形f3 = pa3.toFillPolygon();f4 = pa4.toFillPolygon();QPolygonF su = f3.subtracted(f4);//差painter.drawPolygon(su);QPainterPath pa5 ,pa6;QPolygonF f5,f6;pa5.addEllipse(1100,100,250,250);pa6.addEllipse(1200,200,250,250);//路径转多边形f5 = pa5.toFillPolygon();f6 = pa6.toFillPolygon();QPolygonF in = f5.intersected(f6);//交//绘制painter.drawPolygon(in);
}

不规则型形状

通过图形的交并补形成不规则图像虽然是可行的,但是代码上实现起来并不那么容易。如何实现不规则形状?

可通过qt的不规则窗口方法实现在widget中画出不规则图像。通过设置窗口的mask属性,使用的图片背景的透明区域会作为窗口的透明区域,且透明区域不影响对窗口后的物体的操作。这样形状完全可以由美工画图实现

Qt下实现不规则形状窗口显示_qt异形窗口-CSDN博客

void MyLL::initWidget()
{this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);QPixmap pix;pix.load(":/photo/ll.png",0,Qt::AvoidDither);resize(pix.size());setMask(QBitmap(pix.mask()));                 //设置透明//setAttribute(Qt::WA_TranslucentBackground);   //去除毛边
}void MyLL::paintEvent(QPaintEvent *event)
{//qDebug()<<"event:"<<event;QPainter painter(this);painter.drawPixmap(rect(),QPixmap(":/photo/ll.png"),QRect());QPen pen; //画笔。绘制图形边线,由颜色、宽度、线风格等参数组成pen.setColor(QColor(255,0,0,255));QBrush brush;   //画刷。填充几何图形的调色板,由颜色和填充风格组成brush.setColor(QColor(0,255,0,255));brush.setStyle(Qt::SolidPattern);//可在QPaintDevice上绘制各种图形。QPaintDevice有之类QWidget、QImage、QOpenGLPaintDevice等painter.setPen(pen);painter.setBrush(brush);painter.drawRect(0,0,this->width(),this->height());
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】对进程地址空间的理解

一、关于进程地址空间的简单理解 进程地址空间其实是分了很多个区域的&#xff0c;区域划分的本质就是区域内的各个地址都是可以使用的。如同下面这个图所示&#xff1a; 无论是环境变量的地址还是环境变量表的地址&#xff0c;所存放的地址都在栈的上部。这里的已初始化数据和…

【JavaEE -- 网络初识】

网络初识 1. 局域网和广域网1.1 局域网&#xff08;LAN&#xff09;1.2 广域网WAN 2. 网络通信基础2.1 IP地址2.2 端口号 3. 协议 -- 重点3.1 网络通信协议拆分成多层3.2 TCP/IP 五层网络协议 4. 封装和分用4.1 封装过程4.2 分用过程4.3 网络传输的数据单位 5. 网络编程中的客户…

34.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-登录数据包的监视与模拟

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;33.游戏登录数据…

阿里云-零基础入门NLP【基于深度学习的文本分类3-BERT】

文章目录 学习过程赛题理解学习目标赛题数据数据标签评测指标解题思路BERT代码 学习过程 20年当时自身功底是比较零基础(会写些基础的Python[三个科学计算包]数据分析)&#xff0c;一开始看这块其实挺懵的&#xff0c;不会就去问百度或其他人&#xff0c;当时遇见困难挺害怕的…

pytorch如何向tensor结尾添加元素或维度--torch.cat()、torch.unsqueeze()的用法

目录 示例1 矢量后增加元素 示例2 tensor维度增加1 示例3 另一种替代unsqueeze的方法 示例1 矢量后增加元素 使用torch.cat()函数 ptorch.Tensor([1,5,0]) ptorch.cat((p, torch.Tensor([4])), 0) 结果&#xff1a; 这里&#xff0c;cat的第一个输入变量用()包绕&#xf…

mysql 存储引擎 基本介绍

目录 一 存储引擎概念介绍 &#xff08;一&#xff09;存储引擎概念 &#xff08;二&#xff09;MySQL常用的存储引擎 &#xff08;三&#xff09;存储引擎运作方式 二 MyISAM 存储引擎介绍 &#xff08;一&#xff09; MyISAM 存储引擎特点 1&#xff0c;不支持…

道路与航线

一道类似缩点的好题&#xff0c;先按道路缩点 然后将缩点以后的图按照航线做DAG 在DAG上先跑topsort 在每一个团内部跑dijkstra&#xff0c;同时更新top点 很有意思的一道题目 #include<bits/stdc.h> using namespace std; using ll long long; const int N 3e510; co…

chatgpt和 github copilot chat哪个更强

chatgpt大家应该都不陌生 ChatGPT 是由 OpenAI 开发的一种基于 GPT&#xff08;生成式预训练模型&#xff09;的聊天机器人。它可以生成语言上下文相关的响应&#xff0c;从而进行自然语言对话。ChatGPT 利用大规模的语言数据进行预训练&#xff0c;并通过微调或在线学习来适应…

centos7 linux下yum安装redis

安装redis 1.检查是否有redis yum 源 yum install redis2.下载fedora的epel仓库 yum install epel-release3.安装redis数据库 yum install redis4.安装完毕后&#xff0c;使用下面的命令启动redis服务 # 启动redis service redis start# 停止redis service redis stop# 查…

深入理解栈和队列(二):队列

个人主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《数据结构》 一、队列的概念和结构 队列是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的…

OpenHarmony IDL工具规格及使用说明书(仅对系统应用开放)

IDL接口描述语言简介 当客户端和服务器进行IPC通信时&#xff0c;需要定义双方都认可的接口&#xff0c;以保障双方可以成功通信&#xff0c;OpenHarmony IDL&#xff08;OpenHarmony Interface Definition Language&#xff09;则是一种定义此类接口的工具。OpenHarmony IDL先…

目标检测中的mAP计算原理和源码实现

简介 在目标检测任务中&#xff0c;mAP&#xff08;mean Average Precision&#xff0c;平均精度均值&#xff09;是一个非常重要的评价指标&#xff0c;用于衡量模型在多个类别上的平均性能。它综合考虑了模型在不同召回率下的精确率&#xff0c;能够全面反映模型在检测任务中…