QT(绘图)

目录

QPainter 

QPainter 的一些关键步骤和使用方法:

QPainter 的一些常用接口:

1. 基础绘制接口

2. 颜色和画刷设置

3. 图像绘制

4. 文本绘制

5. 变换操作

6. 渲染设置

7. 状态保存与恢复

8. 其它绘制方法

示例代码1:

示例代码2(音乐播放旋转效果):


QPainter 

QPainter 是 Qt 提供的一个用于绘图的类。它能够在窗口、图像、打印机等设备上进行绘图操作,可以绘制线条、形状、文字、图像等内容。QPainter 通常在窗口的 paintEvent 中使用。

QPainter 的一些关键步骤和使用方法:

  1. 在 paintEvent 中使用 QPainter
    当需要绘图时,一般会重写 paintEvent 方法,在此方法中使用 QPainter 进行绘图。

  2. 开始绘图
    创建一个 QPainter 对象并将其绑定到一个绘图设备(如 QWidget 或 QImage)。

  3. 设置画笔和画刷
    可以使用 QPen 来设置线条的颜色、宽度、样式等;使用 QBrush 设置填充样式。

  4. 绘制图形
    使用 QPainter 的绘图方法,比如 drawLine()drawRect()drawText()drawEllipse()drawImage() 等。

  5. 结束绘图
    QPainter 使用结束后,需要调用 end() 或让 QPainter 对象自动析构。

QPainter 的一些常用接口:

 QPainter 是 Qt 中的一个关键类,用于在窗口、小部件或图像上绘制图形。它提供了丰富的接口来绘制各种图形元素,如直线、矩形、圆、文本和图片等。

以下是 QPainter 的一些常用接口和它们的用途。

1. 基础绘制接口

  • drawLine(const QPoint &p1, const QPoint &p2):绘制从点 `p1` 到点 `p2` 的直线。
painter.drawLine(QPoint(10, 10), QPoint(100, 100));
  • drawRect(int x, int y, int width, int height):绘制一个矩形,指定位置和尺寸。
  painter.drawRect(20, 20, 100, 50);
  • drawEllipse(int x, int y, int width, int height):绘制一个椭圆或圆,指定左上角和尺寸。
  painter.drawEllipse(50, 50, 80, 80);
  • drawPolygon(const QPolygon &polygon):绘制一个多边形,可以通过 `QPolygon` 指定顶点。
  QPolygon polygon;
  polygon << QPoint(60, 80) << QPoint(90, 20) << QPoint(130, 90);
  painter.drawPolygon(polygon);

2. 颜色和画刷设置

  • setPen(const QPen &pen):设置画笔,用于线条、边框和文本等的颜色和样式。
  QPen pen(Qt::red);
  pen.setWidth(2);
  painter.setPen(pen);
  • setBrush(const QBrush &brush):设置画刷,用于填充图形的颜色或纹理。
  painter.setBrush(QBrush(Qt::blue, Qt::SolidPattern));
  painter.drawRect(50, 50, 100, 100);

3. 图像绘制

  • drawPixmap(int x, int y, const QPixmap &pixmap):在指定位置绘制图像。
  QPixmap pixmap(":/images/example.png");
  painter.drawPixmap(100, 100, pixmap);
  • drawImage(const QRect &rectangle, const QImage &image):在矩形区域内绘制图像,支持更丰富的图像格式(如 JPG、PNG 等)。
  QImage image(":/images/example.jpg");
  painter.drawImage(QRect(150, 150, 100, 100), image);

4. 文本绘制

  • drawText(int x, int y, const QString &text):在指定坐标处绘制文本。
  painter.drawText(200, 200, "Hello, Qt!");
  • drawText(const QRect &rectangle, int flags, const QString &text):在指定矩形区域内绘制文本,并设置对齐方式。
 painter.drawText(QRect(100, 100, 200, 50), Qt::AlignCenter, "Centered Text");

5. 变换操作

  • translate(int dx, int dy):平移当前坐标系。
  painter.translate(50, 50);  // 将原点向右下平移50像素
  • rotate(qreal angle):旋转当前坐标系,单位是角度。
  painter.rotate(45);  // 顺时针旋转45度
  • scale(qreal sx, qreal sy):缩放当前坐标系。
  painter.scale(1.5, 1.5);  // 将坐标系放大1.5倍

6. 渲染设置

  • setRenderHint(QPainter::RenderHint hint, bool on = true):设置渲染提示以增强图形效果,例如抗锯齿、平滑等。
  painter.setRenderHint(QPainter::Antialiasing);  // 启用抗锯齿
  • setOpacity(qreal opacity):设置不透明度,用于实现透明效果,取值范围为 `0.0`(完全透明)到 `1.0`(完全不透明)。
  painter.setOpacity(0.5);  // 设置50%透明度

7. 状态保存与恢复

save()restore():用于保存和恢复 QPainter 的状态。在进行复杂绘图时,这两个方法非常实用,可以在修改设置后轻松恢复原来的状态。

  painter.save();
  painter.setPen(Qt::red);
  painter.drawLine(0, 0, 100, 100);
  painter.restore();  // 恢复到原来的设置

8. 其它绘制方法

  • drawArc(const QRect &rect, int startAngle, int spanAngle):绘制圆弧。
 painter.drawArc(QRect(100, 100, 80, 80), 30 * 16, 120 * 16);  // 角度以1/16度为单位
  • drawChord(const QRect &rect, int startAngle, int spanAngle):绘制弦形区域(即部分封闭的圆弧)。
  painter.drawChord(QRect(150, 150, 80, 80), 30 * 16, 120 * 16);
  • drawPie(const QRect &rect, int startAngle, int spanAngle):绘制扇形区域。
  painter.drawPie(QRect(200, 200, 80, 80), 45 * 16, 90 * 16);

示例代码1:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMainWindow>
#include <QPainter>
#include <QPaintEvent>
#include <QTimer>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void paintEvent(QPaintEvent *);
};
#endif // MAINWINDOW_H

mainwindow.c

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setGeometry(0, 0, 800, 480);
}

MainWindow::~MainWindow() {
}

void MainWindow::paintEvent(QPaintEvent *) {
    QPainter painter(this); //this指本窗口

    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); //设置抗锯齿,流畅转换

    // 绘制矩形
    painter.setPen(Qt::blue);
    painter.setBrush(Qt::yellow);
    painter.drawRect(10, 10, 100, 50);

    // 绘制圆
    painter.setBrush(Qt::green);
    painter.drawEllipse(150, 10, 80, 80);

    // 绘制文本
    painter.setPen(Qt::black);
    painter.drawText(50, 150, "Hello, QPainter!");

    // 绘制图像
    QPixmap pixmap(":/image/cd.png");
    painter.drawPixmap(200, 150, pixmap.scaled(80, 80, Qt::KeepAspectRatio, Qt::SmoothTransformation));

}

运行效果:

示例代码2(音乐播放旋转效果):

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMainWindow>
#include <QPainter>
#include <QPaintEvent>
#include <QTimer>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void paintEvent(QPaintEvent *);
private:
    QTimer *timer; //定时器
    int angle;

private slots:
    void timerTimeOut();
};
#endif // MAINWINDOW_H

mainwindow.c

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setGeometry(0, 0, 800, 480);

    angle = 0;

    timer = new QTimer(this);
    timer->start(100); //定时100ms

    connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut()));
}

MainWindow::~MainWindow() {
}

void MainWindow::timerTimeOut() {
    this->update();
}

void MainWindow::paintEvent(QPaintEvent *) {
    QPainter painter(this); //this指本窗口

    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); //设置抗锯齿,流畅转换


    if (angle++ == 360)
        angle = 0;

    QPixmap image; // QPixmap类型对象
    image.load(":/image/cd.png"); //加载图片

    //QRectF即,继承QRect(Qt的矩形类),F代表精确到浮点类型
    QRectF rect((this->width() - image.width()) / 2,
                (this->height() - image.height()) / 2,
                image.width(),
                image.height());

    painter.translate(0 + rect.x() + rect.width() / 2,
                      0 + rect.y() + rect.height() / 2);

    painter.rotate(angle); //旋转角度

    painter.translate(0 - (rect.x() + rect.width() / 2),
                      0 - (rect.y() + rect.height() / 2));

    painter.drawImage(rect, image.toImage(), image.rect());

    painter.drawRect(rect.toRect());

}

注:

void MainWindow::timerTimeOut() {
    this->update();
}

this->update()是在 Qt 中用于刷新或重绘窗口的一种方法。调用 update() 时,Qt 会将该窗口标记为需要重绘,在下一个事件循环周期触发 paintEvent() 方法,从而重新绘制窗口内容。

QRectF rect((this->width() - image.width()) / 2, (this->height() - image.height()) / 2, image.width(), image.height());
  • rect 定义了一个矩形区域,其大小等于 image 的宽和高,位置设置为窗口的中心位置。
  • (this->width() - image.width()) / 2 和 (this->height() - image.height()) / 2 计算出图像居中显示时的左上角坐标。
painter.translate(0 + rect.x() + rect.width() / 2, 0 + rect.y() + rect.height() / 2);
  • painter.translate() 将 QPainter 的原点平移到 rect 的中心。
  • rect.x() 和 rect.y() 分别是 rect 左上角的 x 和 y 坐标,rect.width() /2 和 rect.height() / 2 则将坐标移动到 rect 的中心位置。

运行效果(每隔100ms图片旋转一次):

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【js逆向学习】某多多anti_content逆向(补环境)

文章目录 声明逆向目标逆向分析逆向过程总结 声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的…

【安全解决方案】深入解析:如何通过CDN获取用户真实IP地址

一、业务场景 某大型互联网以及电商公司为了防止客户端获取到真实的ip地址&#xff0c;以及达到保护后端业务服务器不被网站攻击&#xff0c;同时又可以让公安要求留存网站日志和排查违法行为&#xff0c;以及打击犯罪的时候&#xff0c;获取不到真实的ip地址&#xff0c;发现…

Java | Leetcode Java题解之第524题通过删除字母匹配到字典里最长单词

题目&#xff1a; 题解&#xff1a; class Solution {public String findLongestWord(String s, List<String> dictionary) {int m s.length();int[][] f new int[m 1][26];Arrays.fill(f[m], m);for (int i m - 1; i > 0; --i) {for (int j 0; j < 26; j) {…

python爬虫抓取豆瓣数据教程

环境准备 在开始之前&#xff0c;你需要确保你的Python环境已经安装了以下库&#xff1a; requests&#xff1a;用于发送HTTP请求。BeautifulSoup&#xff1a;用于解析HTML文档。 如果你还没有安装这些库&#xff0c;可以通过以下命令安装&#xff1a; pip install requests…

Python实现深度学习模型预测控制(tensorflow)DL-MPC(Deep Learning Model Predictive Control

链接&#xff1a;深度学习模型预测控制 &#xff08;如果认为有用&#xff0c;动动小手为我点亮github小星星哦&#xff09;&#xff0c;持续更新中…… 链接&#xff1a;WangXiaoMingo/TensorDL-MPC&#xff1a;DL-MPC&#xff08;深度学习模型预测控制&#xff09;是基于 P…

简单的ELK部署学习

简单的ELK部署学习 1. 需求 我们公司现在使用的是ELK日志跟踪&#xff0c;在出现问题的时候&#xff0c;我们可以快速定为到问题&#xff0c;并且可以对日志进行分类检索&#xff0c;比如对服务名称&#xff0c;ip , 级别等信息进行分类检索。此文章为本人学习了解我们公司的…

神经网络进行波士顿房价预测

前言 前一阵学校有五一数模节校赛&#xff0c;和朋友一起参加做B题&#xff0c;波士顿房价预测&#xff0c;算是第一次自己动手实现一个简单的小网络吧&#xff0c;虽然很简单&#xff0c;但还是想记录一下。 题目介绍 波士顿住房数据由哈里森和鲁宾菲尔德于1978年Harrison …

Spark的集群环境部署

一、Standalone集群 1.1、架构 架构&#xff1a;普通分布式主从架构 主&#xff1a;Master&#xff1a;管理节点&#xff1a;管理从节点、接客、资源管理和任务 调度&#xff0c;等同于YARN中的ResourceManager 从&#xff1a;Worker&#xff1a;计算节点&#xff1a;负责利…

[java][基础]JSP

目标&#xff1a; 理解 JSP 及 JSP 原理 能在 JSP中使用 EL表达式 和 JSTL标签 理解 MVC模式 和 三层架构 能完成品牌数据的增删改查功能 1&#xff0c;JSP 概述 JSP&#xff08;全称&#xff1a;Java Server Pages&#xff09;&#xff1a;Java 服务端页面。是一种动态的…

常见问题 | 数字签名如何保障电子商务交易安全?

如何解决电商交易中数据泄露、交易欺诈等问题&#xff1f; 数字签名是一种类似于电子“指纹”的安全技术&#xff0c;它在电子商务中扮演着至关重要的角色。随着电子商务的迅猛发展&#xff0c;网上交易的数量不断增加&#xff0c;确保交易的安全性和完整性成为了亟待解决的问题…

【Python基础】

一、编程语言介绍 1、分类 机器语言 (直接用 0 1代码编写&#xff09;汇编语言 &#xff08;英文单词替代二进制指令&#xff09;高级语言 2、总结 1、执行效率&#xff1a;机器语言&#xff1e;汇编语言>高级语言&#xff08;编译型>解释型&#xff09; 2、开发效率&…

Java项目实战II基于Java+Spring Boot+MySQL的编程训练系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当今数字…

双指针习题篇(上)

双指针习题篇(上) 文章目录 双指针习题篇(上)1.移动零题目描述&#xff1a;算法原理&#xff1a;算法流程&#xff1a;代码实现&#xff1a; 2.复写零题目描述&#xff1a;算法原理&#xff1a;算法流程&#xff1a;代码实现&#xff1a; 3.快乐数题目描述&#xff1a;算法原理…

更安全高效的文件传输工具,Ftrans国产FTP替代方案可以了解

文件传输协议&#xff08;FTP&#xff09;&#xff0c;诞生于1971年&#xff0c;自20世纪70年代发明以来&#xff0c;FTP已成为传输大文件的不二之选。内置有操作系统的 FTP 可提供一个相对简便、看似免费的文件交换方法&#xff0c;因此得到广泛使用。 随着企业发展过程中新增…

Leetcode21:合并两个有效链表

原题地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示…

《Mini-internVL》论文阅读:OpenGVLab+清华/南大等开源Mini-InternVL | 1~4B参数,仅用5%参数实现90%性能

论文地址Mini-InternVL: A Flexible-Transfer Pocket Multimodal Model with 5% Parameters and 90% PerformanceGitHub仓库地址模型使用教程和权重下载地址 该论文发表于2024年10月份&#xff0c;截止2024年11月&#xff0c;引用数<10 文章目录 论文摘要1. 引用介绍2. 本文…

双目视觉标定——1原理与实践

0 前言 双目视觉定位是目前机器&#xff08;机器人&#xff09;等领域中使用得非常广泛的视觉定位技术&#xff0c;双目视觉是模拟人的视觉系统利用两个不同位置的摄像头的视差来确定物体的位置。由于有需要采集两个摄像头的图像共同参与计算&#xff0c;所以双目相机装配要求…

免杀对抗—DLL劫持白加黑隐写分离EDRSyscall-hook

前言 今天讲点比较高端的东西—DLL反射注入&#xff0c;首先什么是DLL文件&#xff0c;简答来说就是程序为了实现某个功能而调用的文件。举个例子&#xff0c;某个代码想要实现某个功能是不是会调用一些封装好的函数&#xff0c;exe同样如此&#xff0c;想要实现某个功能就会调…

故障诊断 | MTF-TLSSA-DarkNet-GRU-MSA迁移学习故障识别程序(t分布+莱维飞行改进麻雀优化)

故障诊断 | 故障诊断实例代码 目录 故障诊断 | 故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 利用了迁移学习和多项技术改进&#xff0c;包括麻雀搜索法、DarkNet19、GRU、多头注意力机制等&#xff0c;以提高故障识别的准确性和效率 模型框架&#x…

MyBatis中的多级缓存机制(一级缓存和二级缓存)

MyBatis中的多级缓存机制&#xff08;一级缓存和二级缓存&#xff09; 缓存&#xff08;Cache&#xff09;技术在互联网系统的开发过程中应用非常广泛。当系统中出现性能瓶颈时&#xff0c;很多场景都可以使用缓存技术来重构业务处理流程&#xff0c;从而获取性能的提升。缓存…