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

待研究

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160510.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160510.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160510.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡吞吐量 公網帶寬有關嗎?

環境&#xff1a; 華為交換機 深信服防火墻 問題描述&#xff1a; 網絡吞吐量 公網帶寬有關嗎&#xff1f; 解決方案&#xff1a; 網絡吞吐量網絡吞吐量是指在特定時間內通過網絡傳輸的數據量。它衡量了網絡設備&#xff08;如防火墻、交換機、路由器&#xff09;或網絡連…

終端仿真軟件 SecureCRT v9.4.2

SecureCRT是一款終端仿真軟件&#xff0c;它提供了類似于Telnet和SSH等協議的遠程訪問功能。SecureCRT專門為網絡管理員、系統管理員和其他需要保密訪問網絡設備的用戶設計。 SecureCRT具有以下特點&#xff1a; 安全性&#xff1a;SecureCRT支持SSH1、SSH2、SSL和TLS等加密和…

素短語的定義

素短語&#xff0c;是指至少含有一個終結符的短語&#xff0c;并且除自身外&#xff0c;不包含更小的素短語。 最左素短語是句型中最左邊的素短語。

7.HTML中列表標簽

7.列表標簽 7.1無序列表&#xff08;重點&#xff09; 表格是用來顯示數據的&#xff0c;那么列表就是用來布局的。 列表最大的特點就是整齊&#xff0c;整潔&#xff0c;有序&#xff0c;他作為布局會更加自由和方便&#xff0c; 根據使用的情景不同&#xff0c;列表可分為三…

數字圖像處理(岡薩雷斯)學習筆記

目錄 一.機器視覺和計算機視覺二.圖像處理基礎1.什么是圖像2.如何訪問圖像 三.圖像仿射變換四.灰度變換 一.機器視覺和計算機視覺 機器視覺(Machine Vision,MV)和計算機視覺(Computer Vision&#xff0c;CV)的區別和聯系&#xff1a; 機器視覺更注重廣義圖像信號(激光&#xff…

C#中的Fody

在C#中&#xff0c;NuGet里的Fody是一個用于.NET應用程序的代碼增強工具。它通過在編譯過程中自動織入代碼&#xff0c;改變目標程序集的行為。Fody的一個常見用途是簡化屬性通知的實現&#xff0c;特別適用于WPF綁定。 在WPF中&#xff0c;屬性通知是一種機制&#xff0c;用于…

C語言操作符例題

這里寫目錄標題 例題一題目解析 例題二題目解析 例題三方法一方法二方法三 例題四例題五 感謝各位大佬對我的支持,如果我的文章對你有用,歡迎點擊以下鏈接 &#x1f412;&#x1f412;&#x1f412; 個人主頁 &#x1f978;&#x1f978;&#x1f978; C語言 &#x1f43f;?…

智能指針(Newbie Note)

智能指針專題 1.普通指針的問題2.智能指針是什么什么是所有權 3.智能指針三個好處&#xff1a;4.C11提供的智能指針4.1 shared_ptr&#xff08;共享所有權指針&#xff09;4.1.1 分配內存4.1.2 成員函數4.1.3 計數情況匯總&#xff1a;4.1.4 示例代碼(計數)4.1.5 示例代碼(rese…

Java深拷貝與淺拷貝技術解析及實例演示

摘要&#xff1a;本文將詳細介紹Java中的深拷貝和淺拷貝概念&#xff0c;通過分析源碼和舉例說明&#xff0c;幫助讀者更好地理解這兩種拷貝方式的區別及應用場景。 一、深拷貝與淺拷貝的概念 深拷貝&#xff1a;復制一個對象后&#xff0c;無論是基本數據類型還是引用類型&…

多柱漢諾塔問題

k柱漢諾塔 題目描述 漢諾塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又稱河內塔。 傳說大梵天創造世界的時候做了三根金剛石柱子&#xff0c;按左、中、右排序。大梵天在左側的柱子上&#xff0c;從下往上按照大小順序摞著64片黃金圓盤&#xff0c;越靠下的圓盤越大。…

個人博客項目 - 測試報告

文章目錄 一、項目背景二、測試報告功能測試1.編寫測試用例2.登錄測試3.編寫文章測試4.查看文章測試5.刪除文章測試7.注銷登錄測試 自動化測試性能測試1.VUG2.進行場景設計3.生成性能測試報告 總結 本文開始 一、項目背景 通過學習測試相關的知識&#xff0c;動手實踐并測試一…

2023 年 亞太賽 APMCM ABC題 國際大學生數學建模挑戰賽 |數學建模完整代碼+建模過程全解全析

當大家面臨著復雜的數學建模問題時&#xff0c;你是否曾經感到茫然無措&#xff1f;作為2022年美國大學生數學建模比賽的O獎得主&#xff0c;我為大家提供了一套優秀的解題思路&#xff0c;讓你輕松應對各種難題。 以五一杯 A題為例子&#xff0c;以下是咱們做的一些想法呀&am…

【Vue】自定義指令

自定義指令 自定義指令就是自己定義的指令&#xff0c;是對 DOM 元素進行底層操作封裝 ,程序化地控制 DOM&#xff0c;拓展額外的功能 全局定義 Vue.directive(指令名字, definition) 指令名&#xff1a;不包括v-前綴&#xff0c;使用時候包括v-&#xff0c;v-指令名defini…

CUTLASS 1.3.3中的 Volta884_h884gemm

CUTLASS 是 CUDA C 模板抽象的集合&#xff0c;用于在 CUDA 內的所有級別和規模上實現高性能矩陣-矩陣乘法 (GEMM) 和相關計算。它采用了類似于 cuBLAS 和 cuDNN 中實現的分層分解和數據移動策略。 CUTLASS 最新版本為3.3&#xff0c;相比1.3.3變動較大。然而重溫一下1.3.3仍然…

生產問題 Recv-Q101

生產上服務端口 Recv-Q101 新請求到服務器的失敗&#xff0c;幸好及時發現&#xff0c;通過重啟服務之后得到解決&#xff0c;具體原因等待排查 目前覺得的原因是&#xff1a;某些請求暫用時間比較久

Linux超簡單部署個人博客

1 安裝halo 1.1 切換到超級用戶 sudo -i 1.2 新建halo文件夾 mkdir ~/halo && cd ~/halo 1.3 編輯docker-compose.yml文件 vim ~/halo/docker-compose.yml 英文輸入法下&#xff0c;按 i version: "3"services:halo:image: halohub/halo:2.10container_…

2017年全國碩士研究生入學統一考試管理類專業學位聯考數學試題——解析版

文章目錄 2017 級考研管理類聯考數學真題解析一、問題求解&#xff08;本大題共 5 小題&#xff0c;每小題 3 分&#xff0c;共 45 分&#xff09;下列每題給出 5 個選項中&#xff0c;只有一個是符合要求的&#xff0c;請在答題卡上將所選擇的字母涂黑。真題&#xff08;2017-…

Python 提高篇學習筆記(一):深拷貝和淺拷貝

文章目錄 一、什么是對象的引用二、深拷貝和淺拷貝2.1 淺拷貝(Shallow Copy)2.2 深拷貝(Deep Copy)2.3 copy.copy和copy.deepcopy的區別 一、什么是對象的引用 在 Python 中&#xff0c;對象的引用是指變量指向內存中某個對象的地址或標識符。當你創建一個新的對象(比如一個整…

[技術雜談]計算機系統硬件類名稱

在各種編程語言都可以見到利用WMI查詢計算機硬件信息&#xff0c;因此知道有哪些計算機硬件名稱非常有必要&#xff0c;下面列舉了所有計算機硬件名稱可以查詢。 本文內容 冷卻設備類輸入設備類大容量存儲類主板、控制器和端口類 顯示另外 6 個 計算機系統硬件類別將表示硬…

git修改遠程分支名稱

先拉取old_branch最新代碼到本地 git checkout old_branchgit pull origin old_branch本地修改后并推送 git branch -m old_branch new_branch # 修改分支名稱git push --delete origin old_branch # 刪除在遠程的老分支推送新分支 git push origin new_branch本地分支與遠…