Qt:玩转QPainter序列六

news2024/11/15 4:36:56

前言

继续看源码。

正文

剩下的大部分都是画各种图形的函数,它们一般都有多个重载版本,我就不一 一介绍使用了,只挑其中的一部分使用一下。
在这里插入图片描述
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 对象用于描边,蓝色描边,宽度为 3
    QPen 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.coloradmin.cn/o/2078340.html

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

相关文章

chapter08-面向对象编程——(Object类详解)——day09

目录 319-运算符 320-查看Jdk源码 321-子类重写equals 322-equals课堂练习1 323-equals重写练习2 324-equals重写练习3 325-hashCode 326-toString 327-finalize 319-运算符 引用的都是同一个地址&#xff0c;所以返回true 320-查看Jdk源码 equals只能判断引用类型是…

线程同步学习

1、线程同步的定义 线程同步不是一起、相同&#xff0c;而是协调、协同的意思。 1)按预定的先后次序进行运行&#xff0c;如:您说完&#xff0c;我再说;线程A生成数据后交给线程B处理; 2)公共资源同一时刻只能被一个线程使用;共享数据在同一时刻只能被一个线程修改&#xff0c…

uniapp 小程序支持打开手机相册和摄像头

开发uniapp 时&#xff0c;有时需要让用户上传手机相册或者拍摄图片&#xff0c;对图片进行处理&#xff0c;下面提供了一个method&#xff0c;支持打开摄像头拍照和相册功能&#xff0c;完成后&#xff0c;对图片做base64处理。 // 打开相册的方法openCamera() {let _thisthi…

给自己复盘的tjxt笔记day9

优惠券管理 开发流程 需求分析&#xff0c;接口统计&#xff0c;数据库设计&#xff0c;创建分支&#xff0c;创建新模块&#xff08;依赖&#xff0c;配置&#xff0c;启动类&#xff09;&#xff0c;生成代码&#xff0c;引入枚举状态 优惠券管理 增删改查的业务代码&#…

vagrant 创建虚拟机

创建一个名为 “Vagrantfile” 的文件&#xff0c;修改如下内容&#xff1a; Vagrant.configure("2") do |config|(1..3).each do |i|config.vm.define "k8s-node#{i}" do |node|# 设置虚拟机的Boxnode.vm.box "centos/7"# 设置虚拟机的主机名…

Behave使用体验

behaveuiautomator2jenkins 同理&#xff0c;Behave也可以和Appium/AirTest框架结合 运行环境 pip install uiautomator2 behave behave2cucumber 意事项&#xff1a;behave版本号建议1.2.5&#xff0c;因为1.2.6和Jenkins Cucumber Report插件不兼容 生成报告 html报告 …

各位,请入局AI大模型,现在!立刻!马上!!

AI 大模型人才供不应求 2024年&#xff0c;AI 在国内市场全面大爆发&#xff0c;不断涌现出新的算法、模型和应用场景&#xff0c;各行各业的垂类大模型应用也迎来井喷期。 无论是华为、 百度、阿里、字节等互联网巨头&#xff0c; 还是中小型的科技公司都在高薪挖 AI 大模型人…

易盾空间推理 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…

Codeforces Round 968 (Div. 2) ABC题详细题解(C++,Python)

前言&#xff1a; 本文为Codeforces Round 968 (Div. 2)的ABC详细题解&#xff0c;包含C,Python语言描述&#xff0c;觉得有帮助或者写的不错可以点个赞 感觉D题说的好抽象&#xff0c;看不懂&#xff0c;之后实力够了更新 目录 题A: 题目大意和解题思路: 代码实现(C): 代…

全国大学生数学建模大赛——黄花鱼的最优捕捞策略

渔业管理部门规定&#xff0c;每年只允许在产卵孵化期前的8个 月进行捕捞作业。如果每年投入的捕捞能力(如渔船数、下网 次数等)固定不变&#xff0c;这时单位时间捕捞量将与各年龄组鱼群条 数成正比&#xff0c;比例系数不妨设为捕捞强度系数。通常使用 13mm 网眼的拉网&…

中国高校发表科技论文及著作数量数据集(2009-2022年)

中国各地区的高校科技产出数据&#xff0c;包括27个指标&#xff0c;科技论文发表、著作出版、专利申请、专利转让、国家标准项等。这些指标综合反映了各地区高校在科学研究和技术开发方面的活跃程度及创新能力 一、数据介绍 数据名称&#xff1a;中国地区高校发表科技论文、…

Android App启动流程

1.通过 Launcher 启动应用时&#xff0c;点击应用图标后&#xff0c;Launcher 调用 startActivity 启动应用。 2.Launcher Activity 最终调用 Instrumentation 的 execStartActivity 来启动应用。 3.Instrumentation 调用 ActivityManagerProxy (ActivityManagerService 在应…

计算机类-本科毕业设计快速通关攻略-(选题-创新点-论文框架-论文绘图)

一、推荐选题 大多数人都没有什么基础&#xff0c;不推荐做系统类的&#xff0c;建议走深度学习方向&#xff0c;简单易上手&#xff0c;下面将给出几个我认为不错的方向。 1、目标检测类 目标检测是每年深度学习毕业设计的主流&#xff0c;如Faster R-CNN、YOLO、SSD等算法…

程序员心理健康测试问卷

当然&#xff0c;以下是一份针对程序员设计的心理健康测试问卷。这份问卷旨在帮助程序员评估自己的心理健康状态&#xff0c;并识别可能存在的心理问题。请注意&#xff0c;此问卷仅供参考&#xff0c;不能替代专业心理咨询或诊断。 程序员心理健康测试问卷 基本信息 姓名&am…

为什么不让程序员直接对接客户,而是通过产品经理?

从客户的角度来说&#xff0c;客户需要的是对自身业务的解决方案以及实现&#xff0c;即能够实现解决方案的软件或系统。从程序员的角度来讲&#xff0c;甲方说啥&#xff0c;我按着做就行了&#xff0c;即实现甲方说的软件或系统。但是甲方不懂技术&#xff0c;程序员不懂业务…

备忘录删除了怎么恢复?备忘录失而复得,掌握这3招!

备忘录是我们手机中的秘密花园&#xff0c;守护着每一个重要的思绪、待办事项与未来规划。它们不仅是日常工作的得力助手&#xff0c;更是心灵慰藉的小角落。但有时候&#xff0c;一个不经意的滑动或点击&#xff0c;这些珍贵的笔记和计划可能就会消失。备忘录删除了怎么恢复&a…

jpeg转pdf,分享5种图片转PDF的方法!

在日常工作和学习中&#xff0c;将JPEG图片转换为PDF文件是一项常见的需求。无论是为了保持文件的清晰度&#xff0c;还是为了方便分享和打印&#xff0c;JPEG转PDF都是一项非常实用的操作。本文将分享五种不同的JPEG转PDF的方法&#xff0c;帮助大家轻松完成这一任务。 方法一…

百度搜索的RLHF性能优化实践

作者 | 搜索架构部 导读 本文大语言模型在未经标注的大量文本上进行预训练后&#xff0c;可能产生包含偏见、泄露隐私甚至对人类构成威胁的内容。OpenAI 最先提出了基于人类反馈的强化学习算法(Reinforcement Learning fromHuman Feedback, RLHF)&#xff0c;将人类偏好引入到…

五种多目标优化算法(MOAHA、NSGA2、NSGA3、SPEA2、MODA)性能对比,包含47个多目标测试函数,6种评价指标,MATLAB代码

一、五种多目标算法及六种评价指标简介 NSGA-III&#xff1a; NSGA-III是Deb在2013年提出的&#xff0c;用于解决高维多目标优化问题。它采用参考点基于的非支配排序方法&#xff0c;并引入了种群的自适应标准化和关联操作&#xff0c;以提高算法在高维问题上的性能和多样性 。…

线程 --- 同步与生产消费者模型

序言 在上一篇的内容中&#xff0c;我们学习了使用互斥锁来保护共享资源&#xff0c;避免多个线程竞争&#xff0c;造成数据不一致等问题。在这一篇文章中&#xff0c;我们将继续深入&#xff0c;学习多线程同步以及生产消费者模型。 1. 线程同步 1.1 什么是线程同步 线程互斥…