Qt 界面優化(繪圖)

目錄

  • 1. 繪圖基本概念
  • 2. 繪制各種形狀
    • 2.1 繪制線段
    • 2.2 繪制矩形
    • 2.3 繪制圓形
    • 2.4 繪制文本
    • 2.5 設置畫筆
    • 2.6 設置畫刷
  • 3. 繪制圖片
    • 3.1 繪制簡單圖片
    • 3.2 平移圖片
    • 3.3 縮放圖片
    • 3.4 旋轉圖片
  • 4. 其他設置
    • 4.1 移動畫家位置
    • 4.2 保存/加載畫家的狀態
  • 5. 特殊的繪圖設備
    • 5.1 QPixmap
    • 5.2 QImage
    • 5.3 QPicture
  • 6. 其他話題

1. 繪圖基本概念

(1)雖然 Qt 已經內置了很多的控件,但是不能保證現有控件就可以應對所有場景。

  • 很多時候我們需要更強的 “自定制” 能力。
  • Qt 提供了畫圖相關的 API,可以允許我們在窗口上繪制任意的圖形形狀,來完成更復雜的界面設計。

(2)所謂的 “控件”,本質上也是通過畫圖的方式畫上去的。

  • 畫圖 API 和 控件 之間的關系,可以類比成機器指令和高級語言之間的關系。
  • 控件是對畫圖 API 的進?步封裝;畫圖 API 是控件的底層實現。

(3)繪圖 API 核心類。

說明
QPainter“繪畫者” 或者 “畫家”。用來繪圖的對象,提供了?系列 drawXXX 方法,可以允許我們繪制各種圖形。
QPaintDevice“畫板”。描述了 QPainter 把圖形畫到哪個對象上。像咱們之前用過的 QWidget 也是?種 QPaintDevice (QWidget 是 QPaintDevice 的子類)。
QPen“畫筆”。描述了 QPainter 畫出來的線是什么樣的。
QBrush“畫刷”。描述了 QPainter 填充?個區域是什么樣的。

(4)繪圖 API 的使用一般不會在 QWidget 的構造函數中使用,而是要放到 paintEvent 事件中。關于 paintEvent:

  • paintEvent 會在以下情況下被觸發:
    • 控件首次創建。
    • 控件被遮擋,再解除遮擋。
    • 窗口最小化,再恢復。
    • 窗口最小化,再恢復。
    • 控件大小發生變化時。
    • 主動調用 repaint() 或者 update() 方法。(這兩個方法都是 QWidget 的方法)。
  • 因此,如果把繪圖 api 放到構造函數中調用,那么?旦出現上述的情況,界面的繪制效果就無法確保符合預期了。

2. 繪制各種形狀

2.1 繪制線段

(1)示例1:

void drawLine(const QPoint &p1, const QPoint &p2);
  • 參數:
    • p1:繪制起點坐標。
    • p2:繪制終點坐標。
  • 在 “widget.h” 頭文件中聲明繪圖事件;

  • 在 “widget.cpp” 文件中重寫 paintEvent() 方法;

  • 實現效果如下:

(2)示例2:

void drawLine ( int x1, int y1, int x2, int y2 );
  • 參數:
    • x1,y1:繪制起點坐標。
    • x2,y2:繪制終點坐標。

2.2 繪制矩形

(1)函數原型:

void QPainter::drawRect(int x, int y, int width, int height)
  • 參數:
    • x:窗口橫坐標;
    • y:窗口縱坐標;
    • width:所繪制矩形的寬度;
    • height:所繪制矩形的高度;

(2)示例:

2.3 繪制圓形

(1)函數原型:

void QPainter::drawEllipse(const QPoint &center, int rx, int ry)
  • 參數:
    • center:中心點坐標;
    • rx:橫坐標;
    • ry:縱坐標;

(2)示例:

  • 實現效果:

2.4 繪制文本

(1)QPainter類 中不僅提供了繪制圖形的功能,還可以使用 QPainter::drawText() 函數來繪制文字,也可以使用QPainter::setFont() 設置字體等信息。示例:

  • 實現效果如下:

2.5 設置畫筆

(1)QPainter 在繪制時,是有?個默認的畫筆的。在使用時也可以自定義畫筆。在 Qt 中,QPen類中定義了 QPainter 應該如何繪制形狀、線條和輪廓。同時通過 QPen類 可以設置畫筆的線寬、顏色、樣式、畫刷等。

  • 畫筆的顏色可以在實例化畫筆對象時進行設置,畫筆的寬度是通過 setWidth() 方法進行設置,畫筆的風格是通過setStyle()方法進行設置,設置畫刷主要是通過 setBrush() 方法。
    • 設置畫筆顏色:QPen::QPen(const QColor &color); 畫筆的顏色主要是通過 QColor 類設置;
    • 設置畫筆寬度:void QPen::setWidth(int width);
    • 設置畫筆風格:void QPen::setStyle(Qt::PenStyle style);

(2)畫筆的風格有:

(3)示例:畫筆的使用。

  • 實現效果如下:

2.6 設置畫刷

(1)在 Qt 中,畫刷是使用 QBrush類 來描述,畫刷大多用于填充。QBrush定義了QPainter的填充模式,具有樣式、顏色、漸變以及紋理等屬性。

  • 畫刷的格式中定義了填充的樣式,使用 Qt::BrushStyle 枚舉,默認值是 Qt::NoBrush,也就是不進行任何填充。可以通過 Qt 助手查找畫刷的格式。如下圖示:
  • 設置畫刷主要通過 void QPen::setBrush(const QBrush &brush) 方法,其參數為畫刷的格式。

(2)示例:

  • 實現效果:

3. 繪制圖片

(1)Qt 提供了四個類來處理圖像數據:QImage、QPixmap、QBitmap 和 QPicture,它們都是常用的繪圖設備。

  • 其中QImage主要用來進行 I/O 處理,它對 I/O 處理操作進行了優化,而且可以用來直接訪問和操作像素;QPixmap 主要用來在屏幕上顯示圖像,它對在屏幕上顯示圖像進行了優化;QBitmap 是 QPixmap 的子類,用來處理顏色深度為1的圖像,即只能顯示黑白兩種顏色;QPicture 用來記錄并重演 QPainter 命令。這?節只講解 QPixmap。

3.1 繪制簡單圖片

(1)新建 Qt 項目,基類選擇 QWidget,項目名稱為 QPainter。在 “widget.h” 頭文件中聲明繪畫事件;如下圖示:

  • 添加資源文件;首先準備?些圖片資源文件,并將這些圖片資源文件放在同?個文件夾中,將該文件夾復制到本項目中。

  • 選中項目文件,鼠標右鍵 -------> add new… 。

  • 點擊 “add new…” 之后,出現如下界面:

  • 選擇 “Choose…” 之后,給資源文件命名;

  • 點擊 “下?步”,出現如下界面,點擊 “完成”;

  • 給資源文件添加前綴,并將資源文件添加至項目中;

  • 將所有的資源文件添加到項目中,方便后續使用;

  • 點擊 “構建并運行” 按鈕,將資源文件添加到項目中;

  • 在 “widget.cpp” 文件中實現畫圖片功能;

  • 實現效果如下:

3.2 平移圖片

(1)平移圖片實際是通過改變坐標來實現。QPainter類中提供了 translate()函數 來實現坐標原點的改變。如下示例:

  • 實現效果如下:

3.3 縮放圖片

(1)在 Qt 中,圖片的放大和縮小可以使用 QPainter類 中的 drawPixmap()函數 來實現。示例:

  • 實現效果如下:

3.4 旋轉圖片

(1)圖片的旋轉使用的是 QPainter類 中的 rotate()函數,它默認是以原點為中心進行旋轉的。如果要改變旋轉的中心,可以使用 translate()函數 完成。示例:

  • 實現效果如下:

4. 其他設置

4.1 移動畫家位置

(1)有時候在繪制多個圖形時,想使用同一坐標位置,那么繪制出來的圖形肯定會重合,此時,可以通過移動畫家的位置來使圖形不發生重合。

  • 示例1:未移動畫家位置。

  • 實現效果如下:

  • 示例2:移動畫家位置。使用 translate 移動畫家所在位置:

  • 實現效果如下:

4.2 保存/加載畫家的狀態

(1)在繪制圖形的過程中,可以通過 save() 函數來保存畫家的狀態,使用 restore() 函數還原畫家狀態。

  • save() 函數原型如下:
void QPainter::save();

  • restore() 函數原型如下:
void QPainter::restore();

(2)示例:

  • 實現效果如下:

(3)說明:

  • 上述示例中,在畫第三個圓之前,由于還原了畫家的狀態,所以此時畫家的位置坐標會移動到畫家狀態保存的地方,所以在繪制第三個圓的位置時實際是和第?個圓發生了重疊。

5. 特殊的繪圖設備

(1)前面的代碼中我們是使用 QWidget 作為繪圖設備。在 Qt 中還存在下列三個比較特殊的繪圖設備。此處我們也簡要介紹。

  • QPixmap 用于在顯示器上顯示圖片。
  • QImage 用于對圖片進行像素級修改。
  • QPicture 用于對 QPainter 的?系列操作進行存檔。

5.1 QPixmap

(1)QPixmap 核心特性:

  • 使用 QPainter 直接在上面進行繪制圖形。
  • 通過文件路徑加載并顯示圖片。
  • 搭配 QPainter 的 drawPixmap()函數,可以把這個圖片繪制到?個 QLabel、QPushButton 等控件上。
  • 和系統/顯示設備強相關,不同系統/顯示設備下,QPixmap 的顯示可能會有所差別。

(2)示例:

  • 實現效果:


5.2 QImage

(1)QImage 的核心特性:

  • 使用 QPainter 直接在上面進行繪制圖形。
  • 通過文件路徑加載并顯示圖片。
  • 能夠針對圖片進行像素級別的操作(操作某個指定的像素)。
  • 獨立于硬件的繪制系統,能夠在不同系統之上提供?致的顯示。

(2)代碼示例:QImage 作為繪圖設備的使用。

(3)代碼示例:QImage 繪圖時對像素的修改。

  • 新建 Qt 項目,添加圖片資源文件到項目中;如下圖示:
  • 在 widget.h 頭文件中聲明繪圖事件;

  • 在 widget.cpp 文件中重寫繪圖事件,使用 QImage 對圖片像素進行修改;
    • 通過 setPixel 設置某個像素的顏色值。
    • 使用 qRgb 表示?個具體的顏色。

  • 執行效果如下:
    • 沒有修改像素之前:

  • 修改像素之后:

5.3 QPicture

(1)QPicture 核心特性:

  • 使用 QPainter 直接在上面進行繪制圖形。
  • 通過文件路徑加載并顯示圖片。
  • 能夠記錄 QPainter 的操作步驟。
  • 獨立于硬件的繪制系統,能夠在不同系統之上提供?致的顯示。

(2)注意:
QPicture 加載的必須是自身的存檔文件,而不能是任意的 png, jpg 等圖片文件。

(3)QPicture 類似于很多游戲的 Replay 功能。

  • 例如像 war3 這樣的經典游戲,即使是?場 60 分鐘的膀胱局,生成的 replay 文件,也不過幾百個 KB。
  • 此處的 Replay 功能并非是把整個游戲畫面都錄制保存下來,而是記錄了地圖中發生的所有事件(地圖元素,玩家單位操作,中立生物行為等…)。
  • 當回放 Replay 的時候其實就是把上述記錄的事件再?條?條的執行?遍即可還原之前的游戲場景了。
  • 不了解游戲的也可以理解成警察錄筆錄,并通過筆錄還原案發現場。

(4)如果要記錄下 QPainter 的命令,首先要使用 QPainter::begin() 函數,將 QPicture 實例作為參數傳遞進去,以便告訴系統開始記錄,記錄完畢后使用 QPainter::end() 命令終至。如下示例:

  • 實現效果:

  • 通過 QPicture 重現繪圖指令后,實現的效果如下:

6. 其他話題

(1)Qt 中對于界面的優化美化,還涉及到很多其他的話題。

  • Qt 動畫 。
  • Qt 3D 圖形 。
  • QQuick 。
  • 使用第三方控件庫。
  • Qt Design Studio 。

(2)Qt 的QSS介紹見博客:https://blog.csdn.net/m0_65558082/article/details/147787398?spm=1001.2014.3001.5502

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

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

相關文章

【計算機視覺】優化MVSNet可微分代價體以提高深度估計精度的關鍵技術

優化MVSNet可微分代價體以提高深度估計精度的關鍵技術 1. 代價體基礎理論與分析1.1 標準代價體構建1.2 關鍵問題診斷 2. 特征表示優化2.1 多尺度特征融合2.2 注意力增強匹配 3. 代價體構建優化3.1 自適應深度假設采樣3.2 可微分聚合操作改進 4. 正則化與優化策略4.1 多尺度代價…

Python中,async和with結合使用,有什么好處?

在Python的異步編程中,async和with的結合使用(即async with)為開發者提供了一種優雅且高效的資源管理模式。這種組合不僅簡化了異步代碼的編寫,還顯著提升了程序的健壯性和可維護性。以下是其核心優勢及典型應用場景的分析&#x…

【金倉數據庫征文】金倉數據庫:創新驅動,引領數據庫行業新未來

一、引言 在數字化轉型的時代洪流中,數據已躍升為企業的核心資產,宛如企業運營與發展的 “數字命脈”。從企業日常運營的精細化管理,到戰略決策的高瞻遠矚制定;從客戶關系管理的深度耕耘,到供應鏈優化的全面協同&…

Python學習之路(玖)-圖像識別的實現

在 Python 中,圖像識別對比通常涉及 圖像相似度計算 或 目標檢測與匹配。-淺看一下就行,具體功能代碼,后期會逐步上傳資源。 一、技術方案 1. 圖像相似度計算 目標:計算兩幅圖像的相似度。工具: OpenCV:圖…

【C語言文件操作詳解】fopen 函數全解析 —— 模式參數、使用技巧與重定向的區別

在 C 語言中,文件的讀寫是一個非常常見的需求。fopen 是標準庫中提供的函數,用來打開文件,返回一個文件指針供后續操作使用。本篇博客將詳細介紹 fopen 的使用方法、每個參數的含義,以及它與 Shell 中 >、>> 重定向符的聯…

青少年編程與數學 02-019 Rust 編程基礎 02課題、開始編程

青少年編程與數學 02-019 Rust 編程基礎 02課題、開始編程 一、游戲規則二、實現步驟1. 創建項目2. 編寫代碼3. 添加依賴4. 運行程序 三、代碼解析四、println! 的用法基本用法使用占位符示例控制輸出寬度和精度示例 輸出多個變量示例 注意事項小結 五、管理多個項目1. 創建 Wo…

拒絕flash插件打劫!如何在vscode上玩4399小游戲

現在電腦上玩4399都需要flash插件了 這也導致了很多人無法玩到小時候的游戲 今天介紹一款插件 功能強大 即安即玩 首先打開vscode 點開小方框(拓展)搜索4399 認準4399 on vscode點擊安裝 安裝完畢后 按下 Ctrl Shift P , 輸入 4399 on VSCode 或…

RHCSA Linux系統 Web頁面 論壇 網盤的搭建

Web 服務搭建 [rootlocalhost ~]#yum install httpd -y [rootlocalhost ~]#cd /var/www/htm1/ [rootalocalhost html]#echo 江停嚴峫 >index.html [rootlocalhost html]#setenforce 0 #將 SELinux 模式設置為寬容模式,不強制執行安全策略 [rootlocalhost h…

力扣刷題——二分查找總結

我們可以總結出二分查找的通用做法和常見變種。二分查找是一種在有序數組中高效查找元素的算法,時間復雜度為 O (log n)。 二分查找的通用模板 二分查找的核心思想是將搜索范圍不斷縮小一半,直到找到目標元素或確定其不存在。以下是通用模板&#xff1…

開源數字人框架 AWESOME-DIGITAL-HUMAN 技術解析與應用指南

一、項目概述 AWESOME-DIGITAL-HUMAN 是一個基于 Live2D 技術的開源數字人框架,它集成了語音識別(ASR)、大語言模型(LLM)、語音合成(TTS)和 Agent 模塊化擴展能力,支持快速部署和自…

互聯網大廠Java求職面試:基于RAG的智能問答系統設計與實現-2

互聯網大廠Java求職面試:基于RAG的智能問答系統設計與實現-2 面試背景 鄭薪苦是一名Java開發者,擁有豐富的項目經驗,但在面試中總喜歡用奇葩比喻解釋技術問題。今天他面對的是某大廠技術總監張總,面試主題為“基于RAG的智能問答…

(二)Linux下基本指令 2

【知識預告】 16. date 指令 17. cal 指令 18. find 指令 19. which指令 20. whereis 指令 21. alias 指令 22. grep 指令 23. zip/unzip 指令 24. tar 指令 25. bc 指令 26. uname ?r 指令 27. 重要的?個熱鍵 28. 關機 16 date 指令 指定格式顯?時間:date %Y-…

命令行解釋器中shell、bash和zsh的區別

命令行解釋器(Command Line Interpreter)是一個程序,它的主要作用是接收用戶輸入的命令,并執行相應的操作。它充當了用戶與操作系統內核之間的橋梁。 一、什么是 Shell? Shell 是一個通用術語,指的是 命令…

二、transformers基礎組件之Tokenizer

在使用神經網絡處理自然語言處理任務時,我們首先需要對數據進行預處理,將數據從字符串轉換為神經網絡可以接受的格式,一般會分為如下幾步: - Step1 分詞:使用分詞器對文本數據進行分詞(字、字詞);- Step2 構建詞典:根據數據集分詞的結果,構建…

鏡像和容器的管理

一、鏡像的管理 獲取鏡像并生成相關容器 # 拉取鏡像 docker pull alpine # 默認是latest,也就是最新版本,也可指定版本(在鏡像名后邊加“:版本號”) # 或者 # 從主機中導入鏡像到docker中 docker image load -i /test#生成容器 …

設計模式簡述(十九)橋梁模式

橋梁模式 描述基本組件使用 描述 橋梁模式是一種相對簡單的模式,通常以組合替代繼承的方式實現。 從設計原則來講,可以說是單一職責的一種體現。 將原本在一個類中的功能,按更細的粒度拆分到不同的類中,然后各自獨立發展。 基本…

ImportError: DLL load failed: 找不到指定的程序。

查看其他博客說是缺少libssl-1_1-x64.dll 和 libcrypto-1_1-x64.dll 然后去下載放到博客說的目錄下 沒有用 解決不了一點 OpenSSL for Windows 64位 完整安裝包 在這里 項目地址: https://gitcode.com/open-source-toolkit/eb627 注意事項 此安裝包僅適用于64位Windows系…

電池單元和電極性能

電芯設計中的挑戰 對于電池制造商來說,提高電池能量和功率密度至關重要。在高功率密度和長循環壽命之間取得平衡是電池設計中的關鍵挑戰,通常需要仔細優化材料、電極結構和熱管理系統。另一個關鍵挑戰是通過優化重量體積比來降低電池單元的總體成本。 工…

數據加密與隱私保護:讓你的信息固若金湯

數據加密與隱私保護:讓你的信息固若金湯 大家好,我是 Echo_Wish,今天聊聊一個 人人都關心、但很多人沒做好 的話題——數據加密與隱私保護的最佳實踐。 為什么要重視數據安全? 現在是數字化時代,從個人照片、銀行卡信息到企業機密,數據泄露的風險無處不在。你可能覺得自…

【高數上冊筆記篇02】:數列與函數極限

【參考資料】 同濟大學《高等數學》教材樊順厚老師B站《高等數學精講》系列課程 (注:本筆記為個人數學復習資料,旨在通過系統化整理替代厚重教材,便于隨時查閱與鞏固知識要點) 僅用于個人數學復習,因為課…