Qt:玩转QPainter序列六

2024-08-27 13:28
文章标签 qt 玩转 序列 qpainter

本文主要是介绍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(整数坐标)。

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

这篇关于Qt:玩转QPainter序列六的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111799

相关文章

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要