Qt—QPainter基本图形绘制详解

news2024/11/20 11:30:35

QPainter描述

1、QPainter 类在小部件和其他绘制设备上执行低级绘制。

2、QPainter 提供了高度优化的功能来完成大多数图形GUI程序所需的工作。它可以画从简单的线条到复杂的形状。它还可以绘制对齐的文本和像素图。QPainter 可以对继承 QPaintDevice 类的任何对象进行操作。

3、QPainter 与 QPaintDevice 和 QPaintEngine 类一起构成了Qt绘制系统的基础:

  • QPainter 是用于执行绘图操作的类。

  • QPaintDevice 表示可以使用 QPainter 在其上绘制的设备。

  • QPaintEngine 提供了一个接口,QPainter 可以使用这个接口来绘制不同类型的设备。

项目示例

在右边可以选择绘图样式,左边显示对应的样式效果

绘图区

新建类PaintArea,基类QWidget,作为绘制图形区域。其成员有:

m_shape用于记录绘图样式,例如绘制线或者绘制矩形;m_pen用于记录画笔样式;m_brush用于记录画刷样式,m_fillrule用于记录填充规则。

当左端控制区发生样式改变时,将对应的样式属性传递给PaintArea类对应的成员,然后调用update( )方法重绘窗体来实现绘图区样式的改变。这就需要我们重写printEvent( )方法,来实现绘制自己需要的图形。

PaintArea类构造函数中,设置背景颜色为白色,以及固定大小

控制区样式改变时,将对应的样式属性传递给PaintArea类的对应成员

重写paintEvent( )方法,在函数中根据m_shape图片类型调用对应的绘图函数。

控制区

控制区就是我们的主窗口类,类名为MainWidget,基类QWidget。将上面我们自定义的PaintArea类作为主窗口类的成员,成员名为m_paintArea。

画笔颜色

当点击"更改"按钮时弹出一个颜色对话框,将用户选择的颜色显示在中间QFrame部件中,同时更改绘图区边框颜色

在初始化函数中初始化QFrame的颜色,以及按钮的槽方法连接。tr可以使该显示的文本能够被翻译。

ShowPenColor( )槽方法

在该槽方法中,我们首先获得QFrame部件的颜色,作为打开颜色对话框时的初始颜色,接着从其他样式选项框中获取和画笔样式有关的值。调用PaintArea类的setPen( ) 方法设置画笔样式。

  • 获得部件颜色:QColor color = 部件名称->palette( ).color(QPalette : :Window);参数QPalette::Window表示获得该部件的窗体颜色

  • 获得组合框选中的值:首先调用组合框的currentIndex( )方法获得组合框当前选中值的索引,再调用组合框的itemData(int index).toInt( ),传入索引,并且将返回值转换成int类型,再强转成对应的样式枚举值。

绘制形状

形状选取是一个组合框部件,在初始换函数中将可选取的值添加到组合框中.

在初始化函数中,向组合框添加形状条目,这里我们又将能绘制的形状单独在PaintArea类中用枚举类型声明了一下

ShowShape(int)槽方法

在该槽方法中,我们获取形状组合框选取的值,再调用PaintArea类的setShape( )方法设置形状.

线宽

设置线宽我们采用一个QSpinBox部件来实现,设置取值范围为1到20。

初始化函数

ShowPenWidth( int)槽方法

槽方法可以直接获取到更改的笔宽值

画笔风格

画笔风格的选择是一个组合框,我们可以选择不同的风格,例如实线(SolidLine)、点线(DotLine)或者其他样式,也可以选择自定义的DashLine。

不同的画笔风格对应的效果大致如下

画笔风格的实现代码与画笔颜色大致相同:首先在初始化函数中向组合框添加可选项,再将组合框的信号与槽方法连接。在槽方法中需要注意的是需要设置自定义的DashLine的样式。

初始化函数

ShowPenStyle(int)槽方法

在槽方法中需要设置自定义的DashLine样式

笔帽风格

不同的笔帽风格对应的样式如下

释义:

  • Qt::SquareCap 方形线端,不覆盖线的端点

  • Qt::FlatCap 方形线端,覆盖线的端点,并以线框一半向外延伸

  • Qt::RoundCap 圆线端

初始化函数

ShowPenStyle(int)槽方法

连接点样式

不同的连接点样式对应的效果如下

释义:

  • Qt::BevelJoin 两条线相汇形成方形连接

  • Qt::MiterJoin 两条线相汇形成尖角连接

  • Qt::RoundJoin两条线相汇形成圆角连接

初始化函数

ShowPenJoin(int)槽方法

填充模式

不同的填充模式对应的效果如下

Qt::OddEvenFill填充规则:从图形中某一点画一条水平线到图形外,若这条线与图形边线的交点为奇数则说明此点位于图形的内部;若交点为偶数,则此点在图形的外部。

Qt::WindingFill填充规则:从图形总某一点画一条水平线到图形外,每个交点外边线方向可能向上、向下、方向相反的相互抵消,若结果不为0表此点在图形内,若为0则在图形外。其中边线的方向是由QPainterPath创建时根据描述的顺序决定的,如果采用addRect()或addPolygon()等函数加入的图形默认为顺时针方向。

初始化函数

ShowFileRule(int)槽方法

铺展效果

不同的铺展样式效果如下

初始化函数

ShowSpread(int)槽方法

m_brushSpread是一个QGradient : :Spread类型,用来记录选择的铺展效果。之后调用ShowBrushStyle( int )槽方法来改变样式效果

画刷风格

不同的画刷风格效果如下

初始化函数

ShowBrushStyle(int)槽方法

画刷风格中有几种样式需要特别设置参数,例如QLineGradient就需要设置渐变区域和渐变色

追风赶月莫停留,平芜尽处是春山!

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

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

相关文章

【追光者】2022年终总结,又是一个开始,新的挑战。愿你历尽千帆,归来仍是少年。

本文为我原创,未经授权,禁止转载,本文首发于 CSND博客。 这几天,前前后后,断断续续,一边写博客,一边学习,一边回顾我的2022,打磨了好几天,尽管还是有好多想说…

指针进阶之函数指针和函数指针数组

文章目录一、函数指针1.简单介绍2.回忆函数3.函数地址4.函数指针5.案例(1)案例一(2)案例二(3)案例三(4)案例四代码1代码2误区6.补充二、函数指针数组1.定义2.补充3.案例(…

剑指offer----C语言版----第十二天

目录 打印从1到最大的n位数 1.1 题目描述 1.2 Leetcode上的解题思路 1.3 考虑大数的问题 1.3.1 使用字符串模拟数字的加法 1.3.2 使用全排 打印从1到最大的n位数 原题链接:剑指 Offer 17. 打印从1到最大的n位数 - 力扣(LeetCode)1.1 题…

算法刷题打卡第58天:删除排序链表中的重复元素

删除排序链表中的重复元素 难度:简单 给定一个已排序的链表的头 head ,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2]示例 2: 输入…

Cesiumlab对人工模型、建筑矢量面和BIM模型的处理参数设置 CesiumLab系列教程

CesiumLab中将人工模型(fbx、obj)、建筑矢量面(shp)和BIM模型(clm)的处理都集中在一起,统一使用通用模型处理。 输入文件部分,加载文件在这里不在赘述,输入了文件后&…

陪诊系统搭建,陪诊平台应当具备什么功能?

随着近些年来市场的变化,陪诊服务也在慢慢的受到人们的关注,自从有了陪诊系统之后,帮助了许许多多独立就医不便的人群,给了像是搞不清就诊流程的老年人、家人不方便陪伴的孕妇、残障人士,以及需要陪伴就医的独居人士等…

上海市“专精特新”中小企业和杨浦区“专精特新”中小企业给予5万元和3万元资助

杨浦区“专精特新”中小企业认定一、主管部门杨浦区商务委员会二、政策依据《关于印发<杨浦区“专精特新”中小企业培育工程实施办法>的通知》&#xff08;杨商务委规〔2018〕1号&#xff09;《关于组织推荐2021年度杨浦区“专精特新”中小企业申报(复核)的通知》三、扶持…

【Qt】加载.ui转化的.h头文件显示窗体

【Qt】加载.ui转化的.h头文件显示窗体1、背景2、实例3、验证1、背景 将.ui文件转化为.h头文件参考如下博客&#xff1a; 【Qt】将QtDesigner生成的.ui文件转化为.h头文件 https://jn10010537.blog.csdn.net/article/details/128589666其中生成的ui_widget.h头文件内容如下&am…

TensorFlow之超级参数调优

Keras技术框架提供工具类库&#xff0c;用于对TensorFlow程序相关的超级参数进行调优&#xff0c;为机器学习选择正确的超级参数集合的过程被称之为超级参数调优。 超级参数是指用于治理一个机器学习模型的训练过程及其拓扑结构的变量&#xff0c;这些变量在整个训练过程中保持…

尚医通-项目启动过程

1.先启动Redis&#xff1a; redis-server redis.conf & 2.启动docker&#xff1a; systemctl start docker 3.进入mongo容器&#xff1a; docker exec -it mymongo /bin/bash 4.使用MongoDB客户端进行操作 mongo 5.启动nginx&#xff1a;cmd 输入命令nginx 前期使…

【Kotlin】空安全 ③ ( 手动空安全管理 | 非空断言操作符 !! | 使用 if 语句判空 )

文章目录一、非空断言操作符 !!二、使用 if 语句判空一、非空断言操作符 !! Kotlin 中的 可空类型 变量 , 在运行时 可以选择 不启用 安全调用 操作 , 在调用 可空类型 变量 成员 与 方法 时 , 使用 非空断言操作符 !! , 如果 可空类型 变量为 空 , 则 直接抛出 空指针异常 K…

部署k8s集群

环境准备准备三台虚拟机&#xff0c;建议最小硬件配置&#xff1a;2核CPU、2G内存、20G硬盘 &#xff0c;可以访问外网&#xff0c;&#x1f4a1;ps&#xff1a;以下命令在三台虚拟机上都要执行一遍&#xff0c;直到kubeadm init设置虚拟机hostname sudo hostnamectl set-hostn…

性能优化系列之『混合式开发:小程序内核及优势介绍』

文章の目录一、愿景二、技术优势三、底层内核四、行业背景五、选型建议写在最后一、愿景 触手可及&#xff1a;用户扫一扫或者搜一下即可打开应用用完即走&#xff1a;不用关心是否安装太多应用 二、技术优势 H5 相比 App 开发&#xff0c;开发门槛更低优于 H5&#xff0c;接…

指针进阶篇(1)

目录 &#x1f914; 前言&#x1f914; 一、&#x1f60a;字符指针&#x1f60a; 二、&#x1f61c;指针数组&#x1f61c; 三、&#x1f61d;数组指针&#x1f61d; 3.1数组指针的定义 3.2&数组名VS数组名 3.3数组指针的使用 四、&#x1f31d;数组参数&#xff0c…

LeetCode算法之----回溯

目录 【一】前言 【二】全排列 【三】电话号码的字母组合 【四】括号生成 【五】组合总和 【六】子集 【七】总结 【一】前言 回溯算法采用试错的思想&#xff0c;尝试分步的来解决一个问题。在分步解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的…

helm、k8s dasboard、rancher、kubesphere介绍及使用

文章目录1. helm 安装及使用概述1.1 helm 安装1.1.1 添加仓库1.2 helm 常用命令2. dashboard 部署使用2.1 安装helm repo 源2.2 安装dashboard2.3 查看dashboard 运行状态2.4 创建dashboard-admin.yaml文件2.5 创建登录用户2.6 查看admin-user账户的token2.7 登录dashboard2.8 …

非对称加密实战(二):解决web项目不支持https问题 ,添加证书【附源码】

目录web项目http请求变为https请求解决无法访问https问题重启再次访问https出现链接不安全,但是可以继续访问认证文件加入域名参数生成客户端认证文件证书安装源码地址web项目 http请求变为https请求 http请求 https请求 解决无法访问https问题 需要把 非对称加密实战(一…

【博客576】警惕docker本身iptables规则对网络的影响

警惕docker本身iptables规则对网络的影响 警惕1&#xff1a;k8s环境下&#xff0c;独立拉取docker容器时&#xff0c;进行端口映射会有问题 场景&#xff1a; 在k8s节点由于某种原因&#xff0c;比如&#xff1a;需要拉起一个docker环境来制作镜像&#xff0c;需要拉起一些不…

靶机测试Os-hacknos-3笔记

靶机介绍Difficulty: IntermediateFlag: 2 Flag first user And the second rootLearning: Web Application | Enumeration | Privilege EscalationWeb-site: www.hacknos.comContact-us : rahul_gehlautThis works better with VirtualBox rather than VMware靶机地址https://…

nuPlan: A closed-loop ML-based planning benchmark for autonomous vehicles

Paper name nuPlan: A closed-loop ML-based planning benchmark for autonomous vehicles Paper Reading Note URL: https://arxiv.org/pdf/2106.11810.pdf TL;DR nuPlan 比赛&#xff0c;提出了规控领域新数据集 Introduction 背景 当前自动驾驶规划任务中使用专家系统…