Qt之详解QPainter

news2024/9/17 7:51:15

文章目录

    • 前言
    • QPainter 是干什么的
      • 如何使用 QPainter
      • 在哪个函数使用 QPainter
      • 为什么要在这里使用 QPainter
      • 最简单的示例代码
    • QPainter 函数
      • 构造函数与析构函数
        • QPainter()
        • QPainter(QPaintDevice *device)
        • ~QPainter()
      • 初始化和结束绘图
        • bool begin(QPaintDevice *device)
        • bool end()
      • 状态保存与恢复
        • void save()
        • void restore()
      • 设置绘图属性
        • void setPen(const QPen &pen)
        • void setBrush(const QBrush &brush)
        • void setFont(const QFont &font)
        • void setRenderHint(QPainter::RenderHint hint, bool on = true)
      • 绘制操作
        • void drawLine(const QPointF &p1, const QPointF &p2)
        • void drawRect(const QRectF &rect)
        • void drawEllipse(const QRectF &rect)
        • void drawText(const QRectF &rect, int flags, const QString &text)
        • 更多函数
      • 转换操作
        • void translate(const QPointF &offset)
        • void rotate(qreal angle)
        • void scale(qreal sx, qreal sy)
    • 绘制Y=Asin (ωx+φ)
        • 头文件
  • 总结


前言

QPainter 是 Qt 中用于绘制图形和文本的类,广泛应用于自定义控件和绘图应用程序。它提供了一系列丰富的绘图功能,包括绘制基本图形、文本、图像以及路径。理解 QPainter 的使用方式和相关函数,对于提升 Qt 开发技能、创建美观的界面至关重要。


QPainter 是干什么的

QPainter 是一个强大的绘图类,用于在各种设备上进行绘制操作,如窗口、小部件、图像等。它支持丰富的绘图操作,包括绘制直线、矩形、椭圆、多边形、贝塞尔曲线、文本等,还可以进行图像变换和抗锯齿处理。QPainter 通常用于重载 QWidget 的 paintEvent 函数,以实现自定义绘图。

如何使用 QPainter

使用 QPainter 的一般步骤如下:

  1. 创建 QPainter 对象。
  2. 开始绘制操作。
  3. 设置绘图属性(如颜色、笔刷、字体等)。
  4. 进行绘图操作(如绘制图形、文本等)。
  5. 结束绘制操作。

在哪个函数使用 QPainter

通常在 QWidget 的 paintEvent 函数中使用 QPainter。paintEvent 是一个虚函数,当需要重新绘制窗口或控件时会被调用。通过在这个函数中使用 QPainter,可以实现自定义的绘图逻辑。

void QWidget::paintEvent(QPaintEvent *event);

为什么要在这里使用 QPainter

paintEvent 中使用 QPainter 是因为该函数在窗口需要更新或重绘时被自动调用。通过在这里进行绘图操作,可以确保绘图内容在窗口显示时及时更新,并且可以响应窗口的大小变化、内容变化等事件。

最简单的示例代码

以下是一个简单的示例,展示如何在 QWidget 的 paintEvent 函数中使用 QPainter:

#include <QApplication>
#include <QWidget>
#include <QPainter>

class MyWidget : public QWidget {
    Q_OBJECT
protected:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);
        painter.setPen(Qt::black);
        painter.setBrush(Qt::blue);
        painter.drawRect(10, 10, 100, 100);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyWidget widget;
    widget.resize(200, 200);
    widget.show();
    return app.exec();
}

在这里插入图片描述

QPainter 函数

构造函数与析构函数

QPainter()
QPainter();
  • 作用:创建一个未初始化的 QPainter 对象。
  • 参数:无。
  • 返回值:无。
QPainter(QPaintDevice *device)
QPainter(QPaintDevice *device);
  • 作用:创建一个 QPainter 对象并初始化为在指定设备上进行绘图。
  • 参数
    • QPaintDevice *device:要绘制的设备(如 QWidget、QImage)。
  • 返回值:无。
~QPainter()
~QPainter();
  • 作用:销毁 QPainter 对象,结束绘图操作。
  • 参数:无。
  • 返回值:无。

初始化和结束绘图

bool begin(QPaintDevice *device)
bool begin(QPaintDevice *device);
  • 作用:开始在指定设备上进行绘图。
  • 参数
    • QPaintDevice *device:要绘制的设备。
  • 返回值:返回布尔值 true 表示成功,false 表示失败。
bool end()
bool end();
  • 作用:结束绘图操作。
  • 参数:无。
  • 返回值:返回布尔值 true 表示成功,false 表示失败。

状态保存与恢复

void save()
void save();
  • 作用:保存当前绘图状态。
  • 参数:无。
  • 返回值:无。
void restore()
void restore();
  • 作用:恢复上一次保存的绘图状态。
  • 参数:无。
  • 返回值:无。

设置绘图属性

void setPen(const QPen &pen)
void setPen(const QPen &pen);
  • 作用:设置绘制图形的画笔。
  • 参数
    • const QPen &pen:画笔对象。
  • 返回值:无。
void setBrush(const QBrush &brush)
void setBrush(const QBrush &brush);
  • 作用:设置绘制图形的画刷。
  • 参数
    • const QBrush &brush:画刷对象。
  • 返回值:无。
void setFont(const QFont &font)
void setFont(const QFont &font);
  • 作用:设置绘制文本的字体。
  • 参数
    • const QFont &font:字体对象。
  • 返回值:无。
void setRenderHint(QPainter::RenderHint hint, bool on = true)
void setRenderHint(QPainter::RenderHint hint, bool on = true);
  • 作用:设置绘图时的渲染提示,如抗锯齿。
  • 参数
    • QPainter::RenderHint hint:渲染提示。
    • bool on:是否启用该提示。
  • 返回值:无。

绘制操作

void drawLine(const QPointF &p1, const QPointF &p2)
void drawLine(const QPointF &p1, const QPointF &p2);
  • 作用:绘制一条线。
  • 参数
    • const QPointF &p1:起点。
    • const QPointF &p2:终点。
  • 返回值:无。
void drawRect(const QRectF &rect)
void drawRect(const QRectF &rect);
  • 作用:绘制一个矩形。
  • 参数
    • const QRectF &rect:矩形区域。
  • 返回值:无。
void drawEllipse(const QRectF &rect)
void drawEllipse(const QRectF &rect);
  • 作用:绘制一个椭圆。
  • 参数
    • const QRectF &rect:椭圆的外接矩形区域。
  • 返回值:无。
void drawText(const QRectF &rect, int flags, const QString &text)
void drawText(const QRectF &rect, int flags, const QString &text);
  • 作用:在指定区域内绘制文本。
  • 参数
    • const QRectF &rect:文本的绘制区域。
    • int flags:文本的对齐方式。
    • const QString &text:要绘制的文本。
  • 返回值:无。
更多函数

更多函数请参考Qt帮助文档,他们都是类似的
在这里插入图片描述

转换操作

void translate(const QPointF &offset)
void translate(const QPointF &offset);
  • 作用:平移坐标系。
  • 参数
    • const QPointF &offset:平移的距离。
  • 返回值:无。
void rotate(qreal angle)
void rotate(qreal angle);
  • 作用:旋转坐标系。
  • 参数
    • qreal angle:旋转的角度(单位:度)。
  • 返回值:无。
void scale(qreal sx, qreal sy)
void scale(qreal sx, qreal sy);
  • 作用:缩放坐标系。
  • 参数
    • qreal sx:X 轴的缩放因子。
    • qreal sy:Y 轴的缩放因子。
  • 返回值:无。

绘制Y=Asin (ωx+φ)

我们可以使用 QPainter 绘制一个简单的 sin 曲线。以下示例展示了如何在 QWidget 的 paintEvent 函数中使用 QPainter 绘制 sin 曲线。

头文件
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <cmath>

class SinWidget : public QWidget {
    Q_OBJECT
protected:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);

        // 设置画笔
        painter.setPen(Qt::blue);

        // 获取绘图区域的尺寸
        int width = this->width();
        int height = this->height();

        // 计算 sin 曲线的绘制点
        QPointF points[width];
        for (int i = 0; i < width; ++i) {
            double x = i;
            double y = height / 2 * (1 - std::sin(2 * M_PI * x / width));
            points[i] = QPointF(x, y);
        }

        // 绘制 sin 曲线
        painter.drawPolyline(points, width);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    SinWidget widget;
    widget.resize(400, 300);
    widget.show();
    return app.exec();
}

#include "main.moc"

代码详解

  1. 创建 SinWidget 类:这是一个继承自 QWidget 的类,用于绘制 sin 曲线。
  2. 重载 paintEvent 函数:在 paintEvent 函数中使用 QPainter 进行绘图。
  3. 设置画笔颜色:使用 painter.setPen(Qt::blue) 设置绘制 sin 曲线的画笔颜色为蓝色。
  4. 计算 sin 曲线的绘制点
    • 获取绘图区域的宽度和高度。
    • 计算每个 x 坐标对应的 y 坐标,并存储在 points 数组中。这里使用了标准库中的 std::sin 函数计算 y 坐标。
  5. 绘制 sin 曲线:使用 painter.drawPolyline 函数绘制 sin 曲线。

通过以上代码,可以在一个窗口中绘制出一个简单的 sin 曲线。

在这里插入图片描述
我们可以把它的振幅和间距调小一点
在这里插入图片描述


总结

QPainter 是 Qt 中一个强大而灵活的绘图类,提供了丰富的绘图功能和操作。通过掌握 QPainter 的使用方法和各种函数,可以在 Qt 应用程序中实现自定义的绘图效果,提升用户界面的美观和交互性。希望本篇文章能帮助你更好地理解和使用 QPainter。

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

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

相关文章

x-cmd pkg | yazi - 超快终端文件管理器

目录 简介快速入门功能特点竞品和相关项目进一步阅读 简介 yazi 是由 github.com/sxyazi 用 Rust 开发的终端文件管理器&#xff0c;支持预览文本文件、pdf 文件、图像、视频&#xff0c;内置代码高亮功能。在内部&#xff0c;它使用 Tokio 作为其异步运行时&#xff0c;以非阻…

【百度超级智能体】零代码构建趣味语言游戏:秋日寻宝知识问答

前言 文心智能体平台AgentBuilder是由百度推出的一个创新平台&#xff0c;该平台基于其先进的文心大模型。这个平台旨在帮助开发者根据各自的专业领域和应用场景&#xff0c;以灵活多样的开发方法构建定制化的智能体&#xff08;Agent&#xff09;。通过简单易用的prompt编排功…

详解Qt 定时器QTimer

文章目录 前言QTimer 是什么什么时候使用 QTimer定时器时间到了调用什么函数 QTimer 的所有函数构造函数与析构函数QTimer(QObject *parent nullptr) 基本操作void start(int msec)void start()void stop()bool isActive() const 定时器属性void setInterval(int msec)int int…

瑞芯微平台RK3568系统开发(1)安卓环境搭建

1 开发环境搭建 注意: 重要&#xff01;重要&#xff01;重要&#xff01;自己编译后的固件&#xff0c; 必须先确认io_domains(4.2章节)后&#xff0c;才可以下载到板子运行&#xff0c; 否则可能造成烧坏RK3568的情况。 1.1 更新系统 ~$ sudo apt-get update 1.2 安装依…

MATLAB多元函数梯度下降法找最小值-梯度演示-绘制梯度方向

如果海森矩阵在所有可能的参数值上都是正定的&#xff0c;则该函数是凸的&#xff1b;函数将呈现为光滑的碗状&#xff0c;使得训练过程相对简单。存在单 一的全局最小值&#xff0c;不会有局部最小值或鞍点。 沿着梯度方向&#xff0c;函数变化最快。 x&#xff0c;y点的更新…

LNMP动态网站环境部署

1、LINUX部署 stop firewallddisable selinux 2、Nginx部署 ​ vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://nginx.org/keys/nginx_signing.…

Java 多线程编程核心技术权威指南(电子版教程)

前言 Java多线程编程是现代软件开发中不可忽视的关键技术&#xff0c;它能有效利用多核处理器的计算能力&#xff0c;实现并发执行&#xff0c;提升系统性能和响应速度。本篇博客将带您深入了解Java线程的核心概念、高级用法以及并发编程中的常见问题与解决方案。无论您是Java…

前端web开发HTML+CSS3+移动web(0基础,超详细)——第1天

一、开发坏境的准备 1&#xff0c;在微软商店下载并安装VS Code 以及谷歌浏览器或者其他浏览器&#xff08;我这里使用的是Microsoft Edge&#xff09; 2&#xff0c;打开vs code &#xff0c;在电脑桌面新建一个文件夹命名为code&#xff0c;将文件夹拖拽到vs code 中的右边…

《python语言程序设计》2018版第6章第19题几何问题点的位置,利用4.31显示如何测试一个点是在一条有向线的左、右还是刚好在线上

# 这个是4.31的代码&#xff0c;一个函数里包含了。在线上&#xff0c;在线左&#xff0c;在线右 def judgePoint(x0, y0, x1, y1, x2, y2):juMethod ((x1 - x0) * (y2 - y0)) - ((x2 - x0) * (y1 - y0))if juMethod > 0:print("p2 is on the left side of the line f…

MATLAB 共轭梯度法求解线性方程组(附代码)

共轭梯度法求解线性方程组 1. 引言 共轭梯度法&#xff08;Conjugate Gradient Method&#xff09;是一种用于求解大型稀疏对称正定线性方程组的迭代算法。该方法结合了梯度下降法和共轭方向的概念&#xff0c;以达到更快速的收敛。共轭梯度法 是介于最速下降法与牛顿法之间的…

Android 11(R) IPC Binder机制 初版

Android 系统分为三层。最上层是application应用层&#xff0c;第二层是framework层&#xff0c;第三层是native层 1.Android 中的应用层和系统服务层不在同一个进程&#xff0c;系统服务在单独的进程中。每个应用的进程都是zygote fork出来的。 2.Android中不同应用属于不同…

数据驱动未来:构建下一代湖仓一体电商数据分析平台,引领实时商业智能革命

1.1 项目背景 本项目是一个创新的湖仓一体实时电商数据分析平台&#xff0c;旨在为电商平台提供深度的数据洞察和业务分析。技术层面&#xff0c;项目涵盖了从基础架构搭建到大数据技术组件的集成&#xff0c;采用了湖仓一体的设计理念&#xff0c;实现了数据仓库与数据湖的有…

《程序猿入职必会(4) · Vue 完成 CURD 案例 》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

【优选算法】——leetcode——438.找到字符串中所有字母异位词

目录 1.题目 2.题目理解 3.算法原理 1.如何快速判断两个字符串是否是异位词 2.解决问题 暴力求解——>滑动窗口哈希表 滑动窗口 利用滑动窗口哈希表解决问题 优化&#xff1a;更新结果的判断条件 4.编程代码 C代码 1.频率统计 2. 双指针 C语言代码 1.字符频率…

传统CS网络的新生——基于2G网络的远程灌溉实现

概述&#xff1a;iphone 实现远程电话触发&#xff0c;实现灌溉绿植的一般方法 方法一&#xff1a; 远程电话触发&#xff0c;音频线左右声道会产生一个信号&#xff0c;可以在后端利用SR锁存器暂存信号&#xff0c;后级可以接相应的控制电路实现灌溉。 方法二&#xff1a; 同…

记录阮一峰grid教程笔记

前言 看了阮一峰的grid教程&#xff0c;做一个笔记&#xff0c;主要自己看&#xff0c;有理解错误的地方后续更正&#xff0c;有新的理解后续补充。教程链接如下&#xff1a; CSS Grid 网格布局教程 - 阮一峰的网络日志 grid主要分为容器属性和项目的属性&#xff0c;在行列布…

React 学习——Context机制层级组件通信

核心思路&#xff1a;&#xff08;适用于所有层级&#xff0c;不仅仅是爷孙 父子&#xff09; createContext方法创建一个上下文对象在顶层组件 通过Provider组件提供数据在底层组件&#xff0c;通过useContext钩子函数使用数据 import { createContext, useContext } from …

NSSRound#4 Team

[NSSRound#4 SWPU]1zweb 考察&#xff1a;phar的反序列化 1.打开环境&#xff0c;审计代码 1.非预期解 直接用file伪协议读取flag,或直接读取flag file:///flag /flag 2.正常解法 用读取文件读取index.php,upload.php的源码 index.php: <?php class LoveNss{publi…

Java面试八股之Spring DAO的作用

Spring DAO的作用 Spring DAO (Data Access Object) 是 Spring 框架的一个重要组成部分&#xff0c;它提供了一套用于简化数据访问操作的抽象层。Spring DAO 的核心目的是使开发人员能够更容易地处理数据访问相关的异常&#xff0c;并提供一致的异常处理机制&#xff0c;同时简…

翻译: 可视化深度学习神经网络一

这是一个随意书写的28*28像素、分辨率很低的数字 3 但你的大脑一看见就能轻松辨识出来 &#xff0c;我想要你好好欣赏这点 人脑能够毫无障碍地辨识是非常厉害的 我的意思是&#xff0c;这个、这个、还有这个&#xff0c;都能被识别为 3 即使前后图像的图形组成有很大差异 当你…