QPainter、QPen 、QBrush(概念)

news2025/7/13 16:46:57

Qt中的三大绘画类:

  • QPainter :进行绘画
  • QPaintDevice :提供画图设备,是一个二维的抽象(是所有可绘制对象的基类)
  • QPaintEngine :提供了画家用于绘制到不同类型的设备上的界面

 QPainter(画家)

QPainter 提供高度优化的功能来完成 GUI 程序所需的大部分绘图。它可以绘制从简单线条到复杂形状(如馅饼和和弦)的所有内容。它还可以绘制对齐的文本和像素图。通常,它绘制“自然”坐标系,但它也可以进行视图和世界转换。QPainter 可以对继承QPaintDevice类的任何对象进行操作。

QPainter 一般再一个部件重绘事件的处理函数paintEvent()中进行绘制,使用时先创建QPainter对象。 

void paintEvent(QPaintEvent *event)绘画事件

在QPainter中可以有很多功能

  • 绘制图形

  • 绘制图片

  • 坐标变换等 

构造函数为:

注意创建对象时,一定要指定绘制对象,这样才能绘制。 

void Widget::paintEvent(QPaintEvent *event)//绘画事件
{
    QPainter painter(this);//创建一个画家
}
begin(QPaintEvent *event)开始绘制
end()结束绘制
void Widget::paintEvent(QPaintEvent *event)//绘画事件
{
    QPainter painter;
    painter.begin(this);//指定设备
    painter.end();//结束绘制

}


绘制图形

常用的一些图形:

绘制线条:

void Widget::paintEvent(QPaintEvent *event)//绘画事件
{
    QPainter painter(this);
    painter.drawLine(0,0,100,100);//绘制线条
}

绘制圆形:

void Widget::paintEvent(QPaintEvent *event)//绘画事件
{
    QPainter painter(this);
    painter.drawEllipse(100,100,100,100);//绘制圆
}

绘制矩形:

void Widget::paintEvent(QPaintEvent *event)//绘画事件
{
    QPainter painter(this);
            //        起始点,宽  高
    painter.drawRect(200,200,100,100);//绘制矩形
}

绘制圆弧:

QPainter::drawArc(int x,int y,int width,int height,intstartAngle,intspanAngle)

  • x  y  代表起始点
  • width  height  代表宽度和高度
  • startAngle  spanAngle  代表起始角度和跨越角度

 startAngle  spanAngle  代表起始角度和跨越角度

  • 这里的角度需要*16即一个完整的圆等于 5760 (16 * 360)
  • 正值为逆时针,负值为顺时针

正值为逆时针:

void Widget::paintEvent(QPaintEvent *event)//绘画事件
{

    painter.drawArc(100,100,100,100,90*16,180*16);//绘制弧线,起始点为90,跨度为180

}

负值为顺时针:

void Widget::paintEvent(QPaintEvent *event)//绘画事件
{

    painter.drawArc(100,100,100,100,90*16,-180*16);//绘制弧线,起始点为90,跨度为-180

}

 其他的可以根据帮助文档,查看使用方法。

 

QPen(画笔)

 QPen(画笔)

QPen可以为QPainter提供了画笔来绘制线条和形状的轮廓。

构造函数:

 最常用的构造函数为:

QPen(const QBrush &brush, qrealwidth, Qt::PenStylestyle= Qt::SolidLine, Qt::P enCapStylecap= Qt::SquareCap, Qt::PenJoinStylejoin= Qt::BevelJoin)

  • brush 画刷
  • Qt::PenStylestyle 笔的风格
  • Qt::PenCapStylecap 笔的帽子样式  
  • Qt::PenJoinStylejoin  笔的联接样式

Qt::PenStylestyle笔的风格

Qt::SolidLine实线
Qt::DashLine虚线
Qt::DotLine由几个像素分隔的点
Qt::DashDotLine交替的点和破折号
Qt::DashDotDotLine一个破折号,两个点,一个破折号,两个点
Qt::CushomDashLine使用QPainterPathStroker::setDashPattern() 定义的自定义模式。

 Qt::PenCapStylecap 笔的帽子样式 

Qt::SquareCap

方帽
Qt::FlatCap平帽
Qt::RoundCap圆帽

 

 Qt::PenJoinStylejoin  笔的连接样式

Qt::BevelJoin两条线之间的三角形凹口被填充
Qt::MiterJoin

线的外边缘延伸以成一定角度相交,并填充此区域

Qt::RoundJoin填充两条线之间的圆弧

 常用的函数:

setBrush()设置画刷
setCapStyle设置笔帽风格
setColor()设置颜色

setDashPattern()

将此笔的虚线模式设置为给定模式。这会将笔的样式隐式转换为Qt::CustomDashLine。
setJoinStyle()设置笔的连接样式
setStyle()设置笔的样式
setWidth()设置笔的宽度
setWidthF()设置笔的宽度浮点数

设置自定义的笔的样式:

void Widget::paintEvent(QPaintEvent *event)//绘画事件
{
    QPainter painter(this);
    QPen pen;
    QVector<qreal> sing;
    qreal space=4;//空格数
    sing<<1<<space<<3<<space<<9<<space<<27<<space<<9<<space;//数量必须为双数
    pen.setDashPattern(sing);//设置笔的样式
    pen.setWidth(2);//设置笔的宽度
    painter.setPen(pen);//修改画家的笔

    painter.drawLine(100,100,100,0);//绘制线条
    painter.drawLine(0,0,100,100);//绘制圆
    painter.drawRect(200,200,100,100);//绘制矩形
}

 

QBrush(画刷)

QBrush 类定义了QPainter 绘制的形状的填充图案。

构造函数:

 常用的函数:

setColor()设置颜色
setStyle()设置画刷风格
setTexture()将画笔像素图设置为像素图
setTextureImage()将画笔图像设置为图像
setTransfrom()将矩阵设置为当前画笔上的显式转换矩阵

Qt::GlobalColor(颜色)

Qt::BrushStyle(画刷风格)

 画刷的使用:

void Widget::paintEvent(QPaintEvent *event)//绘画事件
{
    QPainter painter(this);
    QPen pen;
    QVector<qreal> sing;
    qreal space=4;//空格数
    sing<<1<<space<<3<<space<<9<<space<<27<<space<<9<<space;//数量必须为双数
    pen.setDashPattern(sing);//设置笔的样式
    pen.setWidth(2);//设置笔的宽度
    painter.setPen(pen);//修改画家的笔

    QBrush brush(Qt::red,Qt::Dense1Pattern);//设置画刷颜色和风格
    painter.setBrush(brush);//设置画刷

    painter.drawRect(200,200,100,100);//绘制矩形
}

 

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

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

相关文章

Presto 聚合中groupBy分组的实现

一.前言 本文只要探索在Presto中groupby是怎么实现的。在Preso中&#xff0c;groupby的分组主要通过对数据Hash的数值比较进行分组&#xff0c;其中有2种情况&#xff0c;一直是仅有一个groupby字段而且字段是Bigint类型的&#xff0c;此场景下会使用BigintGroupByHash来实现分…

Spring boot使用ProGuard实现代码混淆

目录参考一、 ProGuard简介二、混淆配置要点三、快速开始方案一 配置文件新增proguard.cfg配置插件打包方案二 pom中定义配置参考 Spring boot使用ProGuard实现代码混淆 SpringBoot 玩一玩代码混淆&#xff0c;防止反编译代码泄露 代码混淆常见于安卓的apk安装文件, 服务端的…

11月千言最新评测推荐,覆盖中文对话、视频语义理解、可信AI等前沿方向

千言数据集是百度联合中国计算机学会、中国中文信息学会共同发起的数据共建计划&#xff0c;千言针对每个自然语言处理问题&#xff0c;均收集和整理多个开源数据集&#xff0c;进行统一的处理并提供统一的测评方式&#xff0c;帮助加速模型的研发。截至目前&#xff0c;千言评…

[附源码]java毕业设计上海景宏不锈钢厨房设备报修系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

云原生系列 【轻松入门容器基础操作】

✅作者简介&#xff1a; CSDN内容合伙人&#xff0c;全栈领域新星创作者&#xff0c;阿里云专家博主&#xff0c;华为云云 享专家博主&#xff0c;掘金后端评审团成员 &#x1f495;前言&#xff1a; 最近云原生领域热火朝天&#xff0c;那么云原生是什么&#xff1f;何为云原生…

数据分析 | Pandas 200道练习题 进阶篇(3)

文章目录DA21 大佬用户成就值比例DA22 牛客网用户最高的正确率DA23 统计牛客网用户的名字长度DA24 去掉信息不全的用户DA25 修补缺失的用户数据DA26 解决牛客网用户重复的数据总结&#xff1a;❤️ 作者简介&#xff1a;大家好我是小鱼干儿♛是一个热爱编程、热爱算法的大三学生…

生信步骤|MAFFT结合HMMER进行多序列比对和基于隐马模型的基因搜索

蛋白质都是由相似的小型结构域组成的。如果我们有若干个已知的蛋白序列&#xff0c;那我们就可以根据这些蛋白序列比较其含有的保守域&#xff0c;寻找在蛋白数据库中上是否也有一样保守域的蛋白。而后根据统计学模型&#xff0c;将显著性较高的蛋白序列预测为同一类基因家族蛋…

Oracle SQL执行计划操作(5)——分区相关操作

5. 分区相关操作 该类操作与SQL语句执行计划中分区表操作相关。根据不同的具体SQL语句及其他相关因素&#xff0c;如下各操作可能会出现于相关SQL语句的执行计划。 1&#xff09;PARTITION RANGE ALL 对范围分区&#xff08;RANGE PARTITION&#xff09;表的所有分区进行子…

内存泄漏检测C版小工具

一 内存泄漏简介 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。 内存泄漏分类&#xff1a; 1.堆内存泄漏&#xff1…

基于LMI的非线性混沌系统滑模控制

目录 前言 1.非线性系统 2.控制器设计 3.仿真分析 3.1仿真混沌系统 3.2 LMI求解反馈阵F 3.3仿真模型 ​​​​3.4仿真结果 3.5注意事项 前言 前面我们介绍了很多种滑模面设计&#xff0c;以及介绍了几篇结合LMI的滑模控制&#xff0c;其核心思想可以看作是用LMI去控制…

【python与数据分析】Numpy数值计算基础——补充

目录 二、矩阵生成与常用操作 1.生成矩阵 2.矩阵转置 3.查看矩阵特征 4.矩阵乘法 5.计算相关系数矩阵 6.计算方差、协方差、标准差 7.行列扩展 8.常用变量 9.矩阵在不同维度上的计算 10.应用 &#xff08;1&#xff09;使用蒙特卡罗方法估计圆周率的值 &#xff0…

【Transformers】第 10 章 :从零开始训练 Transformer

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

JS实现复制富文本到剪贴板/粘贴板的最佳实践

背景 最近有想实现一个功能&#xff0c;通过点击一个button按钮&#xff0c;来复制网页内容(含html)来实现复制后粘贴到邮件或者word具有富文本的效果。在网站翻了一些资料&#xff0c;要么就是方法已经被弃用&#xff0c;要么就是兼容性特别差&#xff0c;要么就是不能复制成…

HTML做一个简单漂亮的旅游网页(纯html代码)重庆旅游 7页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 家游景点介绍 | 旅游风景区 | 家乡介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&#xff1a;样式 在操作方面…

HTML+CSS简单漫画网页设计成品--(红猪(9页)带注释)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 网页设计作业 | 动漫网页设计 | 动漫网页设计成品 | 动漫网页设计成品模板 | 简单漫画网页设计成品 | HTML期末大学生网页设计作业&#xff0c;Web大学…

Linux自建RustDesk中继服务器

向日葵、ToDesk&#xff0c;想控制手机。【收费】、【收费】、【收费】、【收费】 作为编程人员&#xff0c;这钱我有点不想花。手里有常开机电脑&#xff0c;于是我萌生想法&#xff0c;使用frp做代理&#xff0c;用adb命令将手机的屏幕截图后展示在网页上&#xff0c;按秒刷…

布谷鸟搜索算法的改进及其在优化问题中的应用(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

GIS重投影的方法

ArcGIS修改地理坐标系/投影坐标系 把坐标系修改为和已知数据坐标系相同&#xff0c;使之能正常显示数据 加载数据&#xff0c;若加载数据的过程中&#xff0c;出现以下提示&#xff0c;则说明坐标系不一致&#xff0c;建议转换。 首先给数据框设置一个坐标系&#xff0c;该坐…

STC51单片机31——红外遥控收发代码

发射部分代码&#xff1a; #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit P20P2^0; //发射引脚 sbit P10P1^0; sbit P11P1^1; uchar k; void delay() { uchar j,i; for(i0;i<255l;i) for(j0;j<255;j) ; } void…

明道云在艾默生数字化实践的新进展

本文来自艾默生电气IT经理丁元才&#xff0c;在明道云2022年秋季伙伴大会活动演讲&#xff0c;经校对编辑后整理为演讲精华。 大家早上好&#xff0c;今天我讲的主题叫《明道云在艾默生数字化实践的新进展》。这个“新进展”刚好契合明道云今天的大会主题——新力量、新希望。…