当前位置: 首页 > news >正文

Qt实现图片旋转的几种方式(全)

目录

一、用手搓(QPainter)

二、使用 QGraphicsView 和 QGraphicsPixmapItem

三、使用 QTransform 实现图像旋转

四、利用 OpenGL


实现旋转图像的效果有几种不同的方法,其中常见的包括:

  1. 手动旋转绘制: 使用 QPainter 的旋转函数,手动计算旋转后的坐标并绘制图像。这种方式需要自己处理旋转后的坐标变换,相对复杂一些。

  2. 使用 QGraphicsView 和 QGraphicsPixmapItem: 使用 QGraphicsView 架构绘制图形对象,并在 QGraphicsScene 中添加 QGraphicsPixmapItem,然后通过旋转 QGraphicsPixmapItem 实现图像旋转。

  3. 使用 QTransform: 使用 QTransform 类来应用变换,通过旋转矩阵来对图像进行旋转,然后使用 QPainter 绘制旋转后的图像。这种方法能够简化坐标变换的操作。

  4. 利用 OpenGL: 利用 Qt 的 QOpenGLWidget 和 OpenGL 的旋转操作,在 OpenGL 上下文中进行图像的绘制和旋转。这种方法适用于需要更高级别的图形操作和性能要求较高的场景。

每种方法都有其特点和适用场景,选择其中一种取决于你的需求和熟悉程度。通常情况下,QTransform 是实现图像旋转最常用且较为简便的方式。

一、用手搓(QPainter

  1. 创建绘图设备(QPainter): 首先,需要创建一个 QPainter 对象,用于执行绘图操作。

  2. 设置绘图参数: 在进行绘图之前,可以通过 QPainter 的函数设置渲染参数,如反锯齿等。

  3. 加载图像: 使用 QPixmap 加载需要绘制的图像。

  4. 设置绘图变换: 使用 QPainter 的变换函数(例如 translate、rotate 等),将绘图坐标系转换到图像的中心,并按需求进行旋转。

  5. 绘制图像: 使用 QPainter 的 drawPixmap 函数,在指定的位置绘制图像。

  6. 重置绘图变换(可选): 如果在绘制其他内容之前需要恢复坐标系变换,则可以使用 QPainter 的 resetTransform 函数重置坐标系。

  7. 完成绘图: 绘图完成后,程序会自动将绘图设备的内容显示到窗口上,或者在需要时手动调用 update 函数触发窗口的重绘。

​手搓代码:https://download.csdn.net/download/qq_43445867/88562187

二、使用 QGraphicsView 和 QGraphicsPixmapItem

1、创建一个 QGraphicsScene 对象。然后加载图像到 QPixmap 中,

2、创建 QGraphicsPixmapItem 对象,并将图像加载到这个 QGraphicsPixmapItem 中。

3、分别使用 setPos()setRotation() 函数,设置图像的位置和旋转角度。

4、将 QGraphicsPixmapItem 添加到 QGraphicsScene

5、创建一个 QGraphicsView 对象,并将 QGraphicsScene 设置为 QGraphicsView 的场景,最终显示了这个 QGraphicsView

6、通过修改 setPos()setRotation() 函数中的参数,可以设置图像的位置和旋转角度。这种方法相比手动绘制更简单,并且使用 QGraphicsViewQGraphicsPixmapItem 更方便地进行图像的操作和显示。

7、创建一个定时器 QTimer,并将其连接到一个 Lambda 函数,Lambda 函数中每次定时器超时时都会更新图像的旋转角度。在每个超时事件中,图像的旋转角度增加 1 度,并通过 setRotation() 函数应用于 QGraphicsPixmapItem,从而使图像持续旋转。然后使用 timer.start() 启动定时器,并设定每 30 毫秒更新一次旋转角度

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsPixmapItem>
#include <QPixmap>
#include <QTimer>
​
int main(int argc, char *argv[]) {QApplication app(argc, argv);
​// 创建 QGraphicsSceneQGraphicsScene scene;
​// 加载图像到 QPixmapQPixmap pixmap("statI.png");
​// 创建 QGraphicsPixmapItem 并将图像加载到 QGraphicsPixmapItem 中QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(pixmap);
​// 设置图像的旋转中心点为图像中心pixmapItem->setTransformOriginPoint(pixmap.width() / 2, pixmap.height() / 2);
​// 将 QGraphicsPixmapItem 添加到 QGraphicsScene 中scene.addItem(pixmapItem);
​// 创建 QGraphicsView,并将 QGraphicsScene 设置为它的场景QGraphicsView view(&scene);
​// 显示 QGraphicsViewview.show();
​// 创建定时器,并连接到槽函数以持续更新旋转角度QTimer timer;QObject::connect(&timer, &QTimer::timeout, [&]() {static qreal rotationAngle = 0.0;rotationAngle += 1.0; // 每次增加旋转角度
​// 将旋转角度应用于 QGraphicsPixmapItempixmapItem->setRotation(rotationAngle);});timer.start(30); // 每 30 毫秒更新一次旋转角度
​return app.exec();
}

三、使用 QTransform 实现图像旋转

使用 Qt 提供的图形组件和定时器来实现图像的加载和旋转,通过设置合适的中心点以及应用 QTransform 进行变换操作,达到了让图像围绕自身中心点旋转的效果。

  // 创建 QTransform 对象,并应用旋转变换QTransform transform;transform.translate(pixmap.width() / 2, pitransform.rotate(rotationAngle); // 绕中心点旋转transform.translate(-pixmap.width() / 2, -// 将变换应用于 QGraphicsPixmapItempixmapItem->setTransform(transform);

通过使用 QGraphicsSceneQGraphicsViewQGraphicsPixmapItem 这些 Qt 图形组件来显示图像,并使用 QTimer 定时器来控制图像的旋转。

  1. 加载图像: 使用 QPixmap 加载图片,并将其放置在 QGraphicsPixmapItem 中,然后将该项添加到 QGraphicsScene 中,最终显示在 QGraphicsView 中。

  2. 设置中心点:QGraphicsPixmapItem 中使用 setTransformOriginPoint() 将图像的中心点设置为图像的中心。

  3. 定时旋转: 创建 QTimer 定时器,每当定时器超时时,更新旋转角度。在超时槽函数中,使用 QTransform 进行变换处理。首先移动图像的原点到中心点,然后进行旋转,最后再将原点移回原位置。这样就实现了图像围绕自身中心点持续旋转的效果。

  4. 显示图像:QGraphicsView 显示出来,图像会根据定时器的触发事件,在固定时间间隔内持续旋转显示。

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsPixmapItem>
#include <QPixmap>
#include <QTransform>
#include <QTimer>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建 QGraphicsSceneQGraphicsScene scene;// 加载图像到 QPixmapQPixmap pixmap(":/path/to/your/image.png");// 创建 QGraphicsPixmapItem 并将图像加载到 QGraphicsPixmapItem 中QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(pixmap);// 设置图像的中心点为原点pixmapItem->setTransformOriginPoint(pixmap.width() / 2, pixmap.height() / 2);// 将 QGraphicsPixmapItem 添加到 QGraphicsScene 中scene.addItem(pixmapItem);// 创建 QGraphicsView,并将 QGraphicsScene 设置为它的场景QGraphicsView view(&scene);// 显示 QGraphicsViewview.show();// 创建定时器,并连接到槽函数以持续更新旋转角度QTimer timer;QObject::connect(&timer, &QTimer::timeout, [&]() {static qreal rotationAngle = 0.0;rotationAngle += 1.0; // 每次增加旋转角度// 创建 QTransform 对象,并应用旋转变换QTransform transform;transform.translate(pixmap.width() / 2, pixmap.height() / 2); // 将原点移动到中心transform.rotate(rotationAngle); // 绕中心点旋转transform.translate(-pixmap.width() / 2, -pixmap.height() / 2); // 将原点移回原位// 将变换应用于 QGraphicsPixmapItempixmapItem->setTransform(transform);});timer.start(30); // 每 30 毫秒更新一次旋转角度return app.exec();
}

四、利用 OpenGL

待研究

相关文章:

Qt实现图片旋转的几种方式(全)

目录 一、用手搓&#xff08;QPainter&#xff09; 二、使用 QGraphicsView 和 QGraphicsPixmapItem 三、使用 QTransform 实现图像旋转 四、利用 OpenGL 实现旋转图像的效果有几种不同的方法&#xff0c;其中常见的包括&#xff1a; 手动旋转绘制&#xff1a; 使用 QPaint…...

常见面试题-Redis持久化策略

谈谈Redis 的持久化策略&#xff1f; 参考文章&#xff1a; Redis 持久化机制演进与百度智能云的实践 Redis的确是将数据存储在内存的&#xff0c;但是也会有相关的持久化机制将内存持久化备份到磁盘&#xff0c;以便于重启时数据能够重新恢复到内存中&#xff0c;避免数据丢…...

一文搞懂什么是 GNU/Linux 操作系统

Author&#xff1a;rab 目录 前言一、UNIX二、Linux三、GNU 前言 你是否经常看见或听说过这么一句话&#xff1a;这是一个类 Unix 的 GNU/Linux 操作系统&#xff0c;你是怎么理解这句话的呢&#xff1f;想要搞懂这句话的含义&#xff0c;你需要了解以下三点基本常识。 一、U…...

sql注入 [极客大挑战 2019]LoveSQL 1

打开题目 几次尝试&#xff0c;发现输1 1"&#xff0c;页面都会回显NO,Wrong username password&#xff01;&#xff01;&#xff01; 只有输入1&#xff0c;页面报错&#xff0c;说明是单引号的字符型注入 那我们万能密码试试能不能登录 1 or 11 # 成功登录 得到账号…...

验证码 | 可视化一键管控各场景下的风险数据

目录 查看今日验证数据 查看未来趋势数据 验证码作为人机交互界面经常出现的关键要素&#xff0c;是身份核验、防范风险、数据反爬的重要组成部分&#xff0c;广泛应用网站、App上&#xff0c;在注册、登录、交易、交互等各类场景中发挥着巨大作用&#xff0c;具有真人识别、身…...

问题解决:Ubuntu18.04下nvcc -V指令可用,/usr/local/下却没有cuda文件夹,原因分析及卸载方法

问题描述 今天要运行一个程序&#xff0c;需要CUDA版本高于10.0&#xff0c;我的电脑无法运行&#xff0c;于是开始检查 首先使用nvidia-smi与nvcc -V指令 能够看出来&#xff0c;当前显卡驱动适合的CUDA版本为12.1&#xff0c;而本机安装的版本是9.1.85&#xff0c;那么就需…...

uniapp+vue3使用pinia,安卓端报错白屏

报错内容&#xff1a; reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->at useStore2 (app-service.js:1487:15)at (app-service.js:1714:17)at (app-serv…...

OpenCV图像处理、计算机视觉实战应用

OpenCV图像处理、计算机视觉实战应用 专栏简介一、基于差异模型模板匹配缺陷检测二、基于NCC多角度多目标匹配三、基于zxing多二维码识别四、基于tesseract OCR字符识别 专栏简介 基于OpenCV C分享一些图像处理、计算机视觉实战项目。不定期持续更新&#xff0c;干货满满&…...

MySQL 事务的底层原理和 MVCC(一)

在事务的实现机制上&#xff0c;MySQL 采用的是 WAL&#xff08;Write-ahead logging&#xff0c;预写式日志&#xff09;机制来实现的。 在使用 WAL 的系统中&#xff0c;所有的修改都先被写入到日志中&#xff0c;然后再被应用到系统中。通常包含 redo 和 undo 两部分信息。 …...

vue3中使用全局自定义指令和组件自定义指令

这篇文章会教大家如何实现全局自定义指令和组件自定义指令 &#x1f4d3;全局自定义指令和组件自定义指令的区别&#xff0c;除了写法不同和作用不同&#xff0c;其他的包括生命周期的使用方法都是一致的&#xff0c;全局自定义指令在main.ts中注册后整个项目都可以使用&#x…...

JVM 堆外内存详解

Java 进程内存占用除了JVM 运行时数据区&#xff0c;还有直接内存&#xff08;Direct Memory&#xff09;区域及 JVM 程序自身也会占用内存 直接内存&#xff08;Direct Memory&#xff09;区域&#xff1a;直接内存通过使用Native堆外内存来存储数据&#xff0c;这意味着数据…...

数据库的基本概念以及MySQL基本操作

一、数据库的基本概念 1、数据库的组成 数据&#xff1a;描述事物的符号记录 包括数字&#xff0c;文字、图形、图像、声音、档案记录等 以“记录”形式按统一格式进行存储 表&#xff1a;将不同的记录组织在一起&#xff0c;用来存储具体数据 数据库&#xff1a; 表的集合…...

【Docker】Docker安装Nginx配置静态资源

1.下载镜像 2.创建nginx配置文件 3.创建nginx容器运行 4.配置nginx静态资源 1.下载镜像 Dockerhub官网&#xff1a;Docker docker pull nginx docker pull nginx下载最新版本 默认latest 下载指定版本docker pull nginx:xxx 2.创建nginx配置文件 启动容器之前要创建nginx…...

【码神之路】【Golang】博客网站的搭建【学习笔记整理 持续更新...】

介绍 一个用原生GO开发的博客网站&#xff0c;涉及Golang Web开发、Web服务器搭建和HTTP请求处理、模板与静态资源处理等 技术栈 后端&#xff1a;Go、Go并发机制前端&#xff1a;HTML模版链接直达 Golang搭建博客网站的学习视频 注&#xff1a;这里我只记录我实质✅学习到…...

Win10 电源选项那选择“关闭显示器“为1分钟,1分钟后就锁屏了?怎么才能关闭显示器后不锁屏

环境&#xff1a; Win10专业版 问题描述&#xff1a; Win10 电源选项那选择"关闭显示器"为1分钟&#xff0c;1分钟后就锁屏了&#xff1f;怎么才能关闭显示器后不锁屏 解决方案&#xff1a; 方法一 更改注册表可以实现关闭显示器而不锁屏的效果。请按照以下步骤…...

虚拟机centos设置网络模式(桥接|NAT)

前言 桥接模式是通过物理网卡直接与外部网络建立联系的&#xff0c;而NAT模式则是通过虚拟网卡VMnet1或VMnet8通过宿主机共享IP与外部建立网络关系当需要将虚拟机资源共享给局域网用户使用时&#xff0c;宜采用桥接模式&#xff1b;当需要保护虚拟机资源&#xff0c;确保只能由…...

MySQL 8.2 Command Line Client打开时一闪而过闪退问题

MySQL8.2安装成功后&#xff0c;发现打开MySQL 8.0 Command Line Client时出现一闪而过&#xff0c;打不开的情况。 解决方案&#xff1a; 1、打开MySQL 8.2 Command Line Client文件位置 2、右键选择属性 3、复制它的目标 4、我复制下来的目标路径是这样的&#xff0c;"…...

【NI-RIO入门】CompactRIO介绍及环境安装

CompactRIO是什么&#xff1f; CompactRIO系统提供了高处理性能、传感器专用I/O和紧密集成的软件工具&#xff0c;使其成为工业物联网、监测和控制应用的理想之选。实时处理器提供可靠&#xff0c;可预测的行为&#xff0c;而FPGA在需要高速逻辑和精确定时的较小任务上表现出色…...

生产问题 Recv-Q101

生产上服务端口 Recv-Q101 新请求到服务器的失败&#xff0c;幸好及时发现&#xff0c;通过重启服务之后得到解决&#xff0c;具体原因等待排查 目前觉得的原因是&#xff1a;某些请求暂用时间比较久...

从零开始:Rust环境搭建指南

大家好&#xff01;我是lincyang。 今天&#xff0c;我们将一起探讨如何从零开始搭建Rust开发环境。 Rust环境搭建概览 Rust是一种系统编程语言&#xff0c;以其安全性、并发性和性能闻名。搭建Rust环境是学习和使用这一语言的第一步。 第一步&#xff1a;安装Rust Rust的…...

2026届最火的AI论文方案推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下的学术以及职场写作环境里头&#xff0c;查重跟降重的需求越发显著了。降重网站作为一…...

到底什么是智能体?一篇文章带你真正搞明白

作者&#xff1a;智能体架构师卢成 | Agent Architect | 意图工程卢成 很多人天天聊智能体、做智能体&#xff0c;我也自称为智能体架构师&#xff0c;但相当一部分人&#xff0c;哪怕是正在做这个行业的人&#xff0c;对这两个词的认知其实都是模糊的。 我先把话放在前面&…...

DeepONet在计算流体力学中的高效流场预测应用

1. 项目背景与核心挑战在计算流体力学领域&#xff0c;复杂几何条件下的非定常流场预测一直是工程实践中的难点问题。传统CFD方法虽然精度较高&#xff0c;但计算成本巨大&#xff0c;单次仿真往往需要数小时甚至数天时间。我在参与某型航空发动机叶片设计项目时&#xff0c;就…...

从PDB文件到结合模式:用LeDock+PyMOL完成一次完整的分子对接与可视化分析

从PDB文件到结合模式&#xff1a;用LeDockPyMOL完成一次完整的分子对接与可视化分析 分子对接技术已成为药物发现和结构生物学研究中不可或缺的工具。对于刚进入这一领域的研究者来说&#xff0c;最大的挑战往往不是单个软件的使用&#xff0c;而是如何将分散的步骤串联成完整的…...

OPE方法:结构化思维解决信息过载决策难题

1. 项目概述&#xff1a;什么是OPE方法&#xff1f;在信息爆炸的时代&#xff0c;我们每天需要处理的数据量呈指数级增长。无论是产品经理梳理用户需求&#xff0c;还是工程师设计系统架构&#xff0c;亦或是学术研究者整理文献资料&#xff0c;都会面临一个共同的困境——并行…...

如何用LeagueAkari打造你的英雄联盟智能助手:从零到精通的完整指南

如何用LeagueAkari打造你的英雄联盟智能助手&#xff1a;从零到精通的完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 想要在英雄联盟…...

Hearthstone-Script:解放双手的炉石传说自动化对战工具

Hearthstone-Script&#xff1a;解放双手的炉石传说自动化对战工具 【免费下载链接】Hearthstone-Script Hearthstone script&#xff08;炉石传说脚本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 你是否厌倦了重复的炉石传说日常任务…...

Reward Forcing:实时视频生成的高效蒸馏方法

1. 项目概述Reward Forcing是一种针对实时流式视频生成任务提出的新型蒸馏方法。在视频生成领域&#xff0c;传统的生成对抗网络(GAN)和扩散模型虽然能产生高质量结果&#xff0c;但存在计算成本高、延迟大的问题&#xff0c;难以满足实时交互场景的需求。Reward Forcing通过引…...

自然语言生成中的并行解码策略:Margin Top-k与Entropy Top-k对比

1. 解码技术背景与核心挑战在自然语言生成任务中&#xff0c;解码策略的选择直接影响生成文本的质量和效率。传统自回归解码&#xff08;Autoregressive Decoding&#xff09;需要逐个token顺序生成&#xff0c;虽然质量稳定但速度受限。为提升解码效率&#xff0c;近年来并行解…...

后端转agent开发全路线 + 踩坑实录

用我的经历给大家一点参考 我是26届ip地9本硕&#xff0c;项目是本科课设做的数据库操作系统编译原理。按理说找个实习不至于这么狼狈&#xff0c;但我25年2月开始投简历的时候&#xff0c;属于那种典型的"自我感觉良好但实际没准备"的状态——觉得自己有项目、有学…...