Qt:玩转QPainter序列六(图形)

前言

继续看源码。

正文

剩下的大部分都是画各种图形的函数,它们一般都有多个重载版本,我就不一 一介绍使用了,只挑其中的一部分使用一下。
在这里插入图片描述
QPainter 类中,这些方法涉及到绘图的各种功能,主要用于设置视图变换、绘制不同类型的图形(如路径、点、线、矩形)等。下面是这些方法的详细解释:

1. 视图变换设置

  • QRect window() const;

    • 返回当前的窗口矩形(绘图区域的逻辑坐标系)。
  • void setWindow(const QRect &window);

    • 设置窗口矩形,定义绘图的逻辑坐标系范围。
  • inline void setWindow(int x, int y, int w, int h);

    • 以整数参数设置窗口矩形。
  • QRect viewport() const;

    • 返回当前的视口矩形(绘图区域的实际坐标系范围)。
  • void setViewport(const QRect &viewport);

    • 设置视口矩形,定义绘图的实际显示区域。
  • inline void setViewport(int x, int y, int w, int h);

    • 以整数参数设置视口矩形。
  • void setViewTransformEnabled(bool enable);

    • 启用或禁用视图变换。启用后,绘图时会应用视图变换。
  • bool viewTransformEnabled() const;

    • 返回视图变换是否启用。

关于上述这些函数是用于设置窗口与物理坐标系的,我有篇博客有讲坐标系Qt坐标系统之三个坐标系和两个变换

2. 绘制路径

  • void strokePath(const QPainterPath &path, const QPen &pen);

    • 使用 QPen 描边 QPainterPath 对象。
  • void fillPath(const QPainterPath &path, const QBrush &brush);

    • 使用 QBrush 填充 QPainterPath 对象。
  • void drawPath(const QPainterPath &path);

    • 绘制 QPainterPath 对象,不进行填充或描边。

例子

void PaintWidget::paintEvent(QPaintEvent* event)
{Q_UNUSED(event);QPainter painter(this);//设置抗锯齿painter.setRenderHint(QPainter::Antialiasing,true);// 1. 创建 QPainterPath 对象QPainterPath path;// 添加一个矩形到路径中path.addRect(50, 50, 200, 100);// 添加一个椭圆到路径中path.addEllipse(100, 75, 100, 50);// 2. 创建 QPen 对象用于描边,蓝色描边,宽度为 3QPen pen(Qt::blue, 3);// 使用 QPen 描边路径painter.strokePath(path, pen);// 3. 创建 QBrush 对象用于填充,黄色填充QBrush brush(Qt::yellow);// 使用 QBrush 填充路径painter.fillPath(path, brush);// 4. 绘制路径(不进行填充或描边)// 绘制路径的颜色和样式取决于当前设置的 QPainter 状态,设置描边颜色为绿色painter.setPen(Qt::green);// 仅绘制路径painter.drawPath(path);}

在这里插入图片描述

3. 绘制点

  • inline void drawPoint(const QPointF &pt);

    • 绘制一个点,参数是 QPointF(浮点坐标)。
  • inline void drawPoint(const QPoint &p);

    • 绘制一个点,参数是 QPoint(整数坐标)。
  • inline void drawPoint(int x, int y);

    • 绘制一个点,参数是整数坐标 (x, y)
  • void drawPoints(const QPointF *points, int pointCount);

    • 绘制一组点,参数是 QPointF 数组和点的数量。
  • inline void drawPoints(const QPolygonF &points);

    • 绘制多边形的点,参数是 QPolygonF 对象。
  • void drawPoints(const QPoint *points, int pointCount);

    • 绘制一组点,参数是 QPoint 数组和点的数量。
  • inline void drawPoints(const QPolygon &points);

    • 绘制多边形的点,参数是 QPolygon 对象。

例子

void PaintWidget::paintEvent(QPaintEvent* event)
{Q_UNUSED(event);QPainter painter(this);//设置抗锯齿painter.setRenderHint(QPainter::Antialiasing,true);//设置粗一点QPen pen;pen.setWidth(10);// 创建点的数组QPoint points[] = {QPoint(50, 50),QPoint(100, 100),QPoint(150, 150),QPoint(200, 200),QPoint(250, 250)};int pointCount = sizeof(points) / sizeof(points[0]);// 设置画笔颜色pen.setColor(Qt::red);painter.setPen(pen);// 绘制点painter.drawPoints(points, pointCount);// 创建一个 QPolygon 对象,包含一组点QPolygon polygon;polygon << QPoint(30, 30)<< QPoint(80, 80)<< QPoint(130, 130)<< QPoint(180, 180)<< QPoint(230, 230);// 设置画笔颜色pen.setColor(Qt::green);painter.setPen(pen);// 绘制点painter.drawPoints(polygon);}

在这里插入图片描述

4. 绘制线

  • inline void drawLine(const QLineF &line);

    • 绘制一条线段,参数是 QLineF(浮点坐标)。
  • inline void drawLine(const QLine &line);

    • 绘制一条线段,参数是 QLine(整数坐标)。
  • inline void drawLine(int x1, int y1, int x2, int y2);

    • 绘制一条线段,参数是起点 (x1, y1) 和终点 (x2, y2) 的整数坐标。
  • inline void drawLine(const QPoint &p1, const QPoint &p2);

    • 绘制一条线段,参数是起点和终点的 QPoint 对象。
  • inline void drawLine(const QPointF &p1, const QPointF &p2);

    • 绘制一条线段,参数是起点和终点的 QPointF 对象。
  • void drawLines(const QLineF *lines, int lineCount);

    • 绘制一组线段,参数是 QLineF 数组和线段的数量。
  • inline void drawLines(const QVector<QLineF> &lines);

    • 绘制一组线段,参数是 QVector<QLineF> 对象。
  • void drawLines(const QPointF *pointPairs, int lineCount);

    • 绘制一组线段,参数是 QPointF 数组中的点对和线段的数量。
  • inline void drawLines(const QVector<QPointF> &pointPairs);

    • 绘制一组线段,参数是 QVector<QPointF> 对象中的点对。
  • void drawLines(const QLine *lines, int lineCount);

    • 绘制一组线段,参数是 QLine 数组和线段的数量。
  • inline void drawLines(const QVector<QLine> &lines);

    • 绘制一组线段,参数是 QVector<QLine> 对象。
  • void drawLines(const QPoint *pointPairs, int lineCount);

    • 绘制一组线段,参数是 QPoint 数组中的点对和线段的数量。
  • inline void drawLines(const QVector<QPoint> &pointPairs);

    • 绘制一组线段,参数是 QVector<QPoint> 对象中的点对。

例子

void PaintWidget::paintEvent(QPaintEvent* event)
{Q_UNUSED(event);QPainter painter(this);//设置抗锯齿painter.setRenderHint(QPainter::Antialiasing,true);//设置粗一点QPen pen;pen.setWidth(5);// 1. 使用 QLine 数组绘制线段QLine linesArray[] = {QLine(10, 10, 100, 10),QLine(10, 20, 100, 20),QLine(10, 30, 100, 30)};int lineCountArray = sizeof(linesArray) / sizeof(linesArray[0]);pen.setColor(Qt::red);painter.setPen(pen);painter.drawLines(linesArray, lineCountArray);// 2. 使用 QVector<QLine> 对象绘制线段QVector<QLine> linesVector;linesVector << QLine(10, 50, 100, 50)<< QLine(10, 60, 100, 60)<< QLine(10, 70, 100, 70);pen.setColor(Qt::green);painter.setPen(pen);painter.drawLines(linesVector);// 3. 使用 QPoint 数组绘制线段(点对)QPoint pointsArray[] = {QPoint(10, 90), QPoint(100, 90),QPoint(10, 100), QPoint(100, 100),QPoint(10, 110), QPoint(100, 110)};int pointCountArray = sizeof(pointsArray) / sizeof(pointsArray[0]) / 2;pen.setColor(Qt::blue);painter.setPen(pen);painter.drawLines(pointsArray, pointCountArray);// 4. 使用 QVector<QPoint> 对象绘制线段(点对)QVector<QPoint> pointsVector;pointsVector << QPoint(10, 130) << QPoint(100, 130)<< QPoint(10, 140) << QPoint(100, 140)<< QPoint(10, 150) << QPoint(100, 150);pen.setColor(Qt::gray);painter.setPen(pen);painter.drawLines(pointsVector);}

在这里插入图片描述

5. 绘制矩形

  • inline void drawRect(const QRectF &rect);

    • 绘制一个矩形,参数是 QRectF(浮点坐标)。
  • inline void drawRect(int x1, int y1, int w, int h);

    • 绘制一个矩形,参数是整数坐标 (x1, y1) 和宽高 (w, h)
  • inline void drawRect(const QRect &rect);

    • 绘制一个矩形,参数是 QRect(整数坐标)。

绘制矩形本篇就不说了,留到下一个序列一起说。

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

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

相关文章

kube-scheduler调度任务的执行过程分析与源码解读(二)

概述 摘要&#xff1a; 上文我们对Kube-scheduler的启动流程进行了分析&#xff0c;本文继续探究kube-scheduler执行pod的调度任务的过程。 正文 说明&#xff1a;基于 kubernetes v1.12.0 源码分析 上文讲到kube-scheduler组件通过sched.Run() 启动调度器实例。在sched.Run(…

校园牛奶订购配送小程序开发制作方案

校园牛奶订购配送小程序系统的开发方案&#xff0c;包括对用户需求的分析、目标用户的界定、使用场景的设定以及开发功能模块的规划。校园牛奶订购配送小程序系统主要是为校园内学生和教职工提供牛奶订购与配送服务。 目标用户 主要面向在校学生、教职工以及其他有牛奶订购需求…

这四种人不能合作做生意

合伙创业千万不要和这四种人合伙&#xff0c;不然公司做大了都不是你的&#xff01; 一、不愿出钱的人&#xff0c;不愿出钱就不会有决心。公司一旦有风吹草动&#xff0c;最先跑路的都是没有出钱的。 二、不愿付出时间的人&#xff0c;想用业余时间参与&#xff0c;不愿全身心…

如何使用Svg矢量图封装引用到vue3项目中

前言 在现代前端开发中&#xff0c;SVG&#xff08;可缩放矢量图形&#xff09;因其高质量和灵活性成为了图标和图形设计的热门选择。对于 Vue 3 项目而言&#xff0c;将 SVG 图标封装和引用到项目中不仅能提升性能&#xff0c;还能带来更高的可维护性和一致性。SVG 图标本质上…

卡西莫多的诗文集2022-2024.8月定稿

通过网盘分享的文件&#xff1a;卡西莫多的诗文集2022-2024.8月30-A5.pdf 链接: https://pan.baidu.com/s/1_BrcKvUthFLlty8dWNZxjQ?pwdutwd 提取码: utwd 自从解锁了一项新技能后&#xff0c;从藏内容诗开始&#xff0c;自己积攒到现在不知不觉也积累了一些诗&#xff0c;看…

Runway删库跑路,真的run away了!

没有任何通知&#xff0c;Runway在Hugging Face上的内容全部删除了&#xff01; 目前具体原因不明。Runway的主页只留下了一句话&#xff1a; 我们不再对HuggingFace账号进行维护。 据悉&#xff0c;Runway在Hugging Face上&#xff0c;最火的、也是争议最大的项目&#xff0c;…

【spring】学习笔记1:starter和application

https://spring.io/toolsSpring Boot Extension Pack vs版本 使用Spring Tool Suite初始化Spring项目

Python__面向对象__多态学习

目录 一、多态 1.多态定义理解 2.实例属性和类属性 3.类相关的函数 (1) 实例方法 (2)类方法 (3)静态方法 一、多态 1.多态定义理解 在Python中&#xff0c;多态是一种特性&#xff0c;类似于一个接口&#xff0c;允许在一个对象中的一个操作可作用在不同类型的对象上…

IT管理员的秘密武器:高效管理服务器的远程控制软件

如果你出外勤却紧急需要一份文件&#xff0c;是不是有种热锅上蚂蚁的感觉。这时候如果能远程公司的电脑就能获得马上获得那份心心念念的文件咯。今天我就分享几款轻松好操作的远程控制工具帮你走出困境。 1.向日葵远程控制 链接直通车&#xff1a;https://down.oray.com 这个…

进程间通信----管道篇

目录 一丶 无名管道 1. 特点 2. 读写特性 3. 函数接口 二丶有名管道 1.特点&#xff1a; 2.函数接口 3. 读写特性 一丶 无名管道 1. 特点 1. 只能用于具有亲缘关系的进程之间的通信 2. 半双工的通信模式&#xff0c;具有固定的读端和写端 3. 管道可以…

4G手机智能遥控开关

什么是4G手机智能遥控开关 4G手机智能遥控开关作为现代智能家居与工业自动化的重要组成部分&#xff0c;提供了便捷、高效的远程控制方案。它利用4G通信技术&#xff0c;允许用户随时随地通过智能手机或其他移动设备控制电器设备的开关状态&#xff0c;适用于家庭、办公、工业等…

【Android】MotionLayout实现动画效果

【Android】MotionLayout实现开场动画 在移动应用开发中&#xff0c;动画不仅仅是美化界面的工具&#xff0c;它更是提升用户体验的关键手段。Android 平台一直以来都提供了丰富的动画框架&#xff0c;但随着应用复杂性的增加&#xff0c;开发者对动画的需求也变得更加复杂和多…

AcWing898. 数字三角形

线性DP 董晓老师的讲解是从下标0开始算的&#xff0c;其实我们从1开始也可以&#xff0c;我感觉这里从1开始更好理解。是从下往上计算的。j负责列的计算&#xff0c;往上计算时逐步收窄横向的范围&#xff0c;i是纵向的从下往上算&#xff0c; 下面是内存布局 下面是逻辑上的…

android 离线的方式使用下载到本地的gradle

1、android studio在下载gradle的时候&#xff0c;特别慢&#xff0c;有的时候会下载不完的情况&#xff0c;这样我们就要离线使用了。 2、下载Gradle Gradle | Releases 或者 Releases gradle/gradle GitHub Gradle | Releases 这里我们下载8.10 complete版本&#xff0c…

Tomcat10安装

Tomcat下载 进入官网下载https://tomcat.apache.org 注意tomcat版本和Java版本的对应关系&#xff1a; 配置好JAVA_HOME 安装tomcat前&#xff0c;需要先配置好JAVA_HOME&#xff0c;因为tomcat启动时候默认会找环境里面的JAVA_HOME&#xff0c;这里选择的Java版本是java1…

【工具篇】高效记忆方法之AnKi工具

&#x1f60a;你好&#xff0c;我是南极。正在变强的路上不断地努力着&#x1f4aa; &#x1f514;今天和大家分享一些记忆的方法&#xff0c;以及推荐了一款用于复习和巩固知识的软件AnKi。 对我们程序员而言&#xff0c;平常学习的东西会比较多&#xff0c;有时呢学的东西会…

结合代码详细讲解DDPM的训练和采样过程

本篇文章结合代码讲解Denoising Diffusion Probabilistic Models&#xff08;DDPM&#xff09;&#xff0c;首先我们先不关注推导过程&#xff0c;而是结合代码来看一下训练和推理过程是如何实现的&#xff0c;推导过程会在别的文章中讲解&#xff1b;首先我们来看一下论文中的…

<C++> AVLTree

目录 1. AVL概念 2. AVL树节点的定义 3. AVL树的插入 4. AVL树的旋转 5. AVL树的验证 6. AVL树的删除 7. AVL树的性能 暴力搜索、二分搜索、二叉搜索树、二叉平衡搜索树&#xff08;AVL、红黑树&#xff09;、多叉平衡搜索树&#xff08;B树&#xff09;、哈希表 1. AVL概念 二…

【C++ Primer Plus习题】7.2

问题: 解答: #include <iostream> using namespace std;#define MAX 10int input(float* grade, int len) {int i 0;for (i 0; i < len; i){cout << "请输入第" << i 1 << "个高尔夫成绩(按0结束):";cin >> grade[i]…

更改了ip地址怎么改回来

在日常的网络使用中&#xff0c;‌我们有时会因为特定的需求更改设备的IP地址&#xff0c;‌比如解决IP冲突、‌访问特定网络资源或进行网络测试等。‌然而&#xff0c;‌更改IP地址后&#xff0c;‌我们可能又因为某些原因需要将IP地址改回原来的设置。‌本文将详细介绍如何改…