柚子快報激活碼778899分享:開發(fā)語言 【Qt】繪圖API
柚子快報激活碼778899分享:開發(fā)語言 【Qt】繪圖API
基本概念?
在前面學習Qt過程中的各種控件,其本質(zhì)上都是畫出來的,這些都是比較常用的東西,Qt已經(jīng)畫好了,拿過來就可以使用,但是在實際開發(fā)過程中,現(xiàn)有的控件可能無法滿足需求,就需要自己手動diy 一些控件/效果。
Qt 提供的 繪圖 API 就是為了解決上述問題。Qt 提供了畫圖相關(guān)的 API, 可以允許我們在窗?上繪制任意的圖形形狀, 來完成更復(fù)雜的界?設(shè)計。
所謂的 "控件" , 本質(zhì)上也是通過畫圖的?式畫上去的.
畫圖 API 和 控件 之間的關(guān)系, 可以類?成機器指令和?級語?之間的關(guān)系.
控件是對畫圖 API 的進?步封裝; 畫圖 API 是控件的底層實現(xiàn).
繪圖API核心類
類說明
QPainter
"繪畫者" 或者 "畫家".
?來繪圖的對象, 提供了?系列 drawXXX ?法, 可以允許我們繪制各種圖形.
QPaintDevice
"畫板".
描述了 QPainter 把圖形畫到哪個對象上. 像咱們之前?過的 QWidget 也是?種 QPaintDevice (QWidget 是 QPaintDevice 的?類)
QPen
"畫筆".
描述了 QPainter 畫出來的線是什么樣的.
QBrush
"畫刷".
描述了 QPainter 填充?個區(qū)域是什么樣的.
繪圖 API 的使?, ?般不會在 QWidget 的構(gòu)造函數(shù)中使?, ?是要放到
paintEvent
事件中
paintEvent 會在以下情況下被觸發(fā):
控件?次創(chuàng)建(例如:往QWidget上畫畫,QWidget創(chuàng)建之前,畫的東西不會生效,而當首次創(chuàng)建QWidget就能顯示出畫的東西來)控件被遮擋, 再解除遮擋(這個時機進行繪制也是非常重要的,否則繪制的內(nèi)容就會在被遮擋之后消失)窗?最?化, 再恢復(fù)
控件??發(fā)?變化時
主動調(diào)? repaint() 或者 update() ?法. (這兩個?法都是 QWidget 的?法)
因此, 如果把繪圖 api 放到構(gòu)造函數(shù)中調(diào)?, 那么?旦出現(xiàn)上述的情況, 界?的繪制效果就?法確保符合預(yù)期了。
例子:繪制線段、矩形、圓形
(1)在widget.h文件中聲明繪制事件
(2)實例化對象
這里定義在棧上的變量,不需要考慮釋放的問題,此處的指定的this,不是父對象,而是指定繪制的設(shè)備(往什么東西上畫)
?(3)繪制線段
void drawLine(const QPoint &p1, const QPoint &p2);
參數(shù):
p1:繪制起點坐標p2:繪制終點坐標
void drawLine ( int x1, int y1, int x2, int y2 );
參數(shù):
x1,y1:繪制起點坐標 x2,y2:繪制終點坐標
(4)繪制矩形
void QPainter::drawRect(int
x
, int
y
, int
width
, int
height
)
;
參數(shù):
x:窗?橫坐標; y:窗?縱坐標; width:所繪制矩形的寬度; height:所繪制矩形的?度
(5)繪制圓形
void QPainter::drawEllipse(const QPoint &
center
, int
rx
, int
ry
)
參數(shù):
center:中?點坐標 rx:橫坐標 ry:縱坐標
?
繪制圓形的寬度和高度是外接矩形的寬度和高度
例子:繪制文字(顯示文字)
QPainter類 中不僅提供了繪制圖形的功能,還可以使? QPainter::drawText() 函數(shù)來繪制?字,也可以使?QPainter::setFont() 設(shè)置字體等信息。
注意理解這里的坐標位置,此處的0橫坐標,表示的是文字最左側(cè)的位置;此處的100縱坐標,表示的是文字的基線位置(baseline)。
基線:指的是拼音格中的第三根線就是基線。
例子:設(shè)置畫筆
通過畫筆對象QPen設(shè)置繪制的形狀的顏色信息、粗細、樣式。
QPainter 在繪制時,是有?個默認的畫筆的。在使?時也可以?定義畫筆。在 Qt 中,QPen類中定義了 QPainter 應(yīng)該如何繪制形狀、線條和輪廓。同時通過 QPen類 可以設(shè)置畫筆的線寬、顏?、樣式、畫刷等。
畫筆的顏?可以在實例化畫筆對象時進?設(shè)置,畫筆的寬度是通過 setWidth() ?法進?設(shè)置,畫筆的?格是通過setStyle()?法進?設(shè)置,設(shè)置畫刷主要是通過 setBrush() ?法。
設(shè)置畫筆顏?:QPen::QPen(const QColor &color) 畫筆的顏?主要是通過 QColor 類設(shè)置;設(shè)置畫筆寬度:void QPen::setWidth(int width)設(shè)置畫筆?格:void QPen::setStyle(Qt::PenStyle style)
畫筆的風格有:
(1)實例化畫家
(2)設(shè)置畫筆
(3)畫家使用畫筆
(4)執(zhí)行程序?
(5)全部代碼
例子:設(shè)置畫刷
在 Qt 中,畫刷是使? QBrush類 來描述,畫刷?多?于填充。QBrush定義了QPainter的填充模式,具有樣式、顏?、漸變以及紋理等屬性。
畫刷的格式中定義了填充的樣式,使? Qt::BrushStyle 枚舉,默認值是 Qt::NoBrush,也就是不進?任何填充??梢酝ㄟ^ Qt 助?查找畫刷的格式。如下圖?:
設(shè)置畫刷主要通過
void QPen::setBrush(const QBrush &
brush
) ?法,其參數(shù)為畫刷的格式。
例子:繪制圖片
Qt 提供了四個類來處理圖像數(shù)據(jù):QImage、QPixmap、QBitmap 和 QPicture,它們都是常?的繪圖設(shè)備。其中QImage主要?來進? I/O 處理,它對 I/O 處理操作進?了優(yōu)化,?且可以?來直接訪問和操作像素;QPixmap 主要?來在屏幕上顯?圖像,它對在屏幕上顯?圖像進?了優(yōu)化;QBitmap是 QPixmap 的?類,?來處理顏?深度為1的圖像,即只能顯???兩種顏?;QPicture ?來記錄并重演 QPainter 命令。
通過QPixmap這個類,就可以表示一個圖片
(1)使用qrc添加圖片
(2)設(shè)置圖片?
(3)程序運行
例子:旋轉(zhuǎn)圖片
圖片旋轉(zhuǎn),本質(zhì)上是把QPainter對象進行了旋轉(zhuǎn),繪制出來的內(nèi)容也就產(chǎn)生了旋轉(zhuǎn)。
painter.ratate(180)是按著(0,0)坐標系原點進行的旋轉(zhuǎn)。
為了讓圖片顯示出來,可以把坐標系原點(Painter 的起點)平移一些。
關(guān)于幾種圖片類的介紹
在QPixmap的官方文檔中:?
在 Qt 中還存在下列三個?較特殊的繪圖設(shè)備. 此處也簡要介紹.
QPixmap ?于在顯?器上顯?圖?. QImage ?于對圖?進?像素級修改. QPicture ?于對 QPainter 的?系列操作進?存檔.
QPixmap核?特性:
使? QPainter 直接在上?進?繪制圖形. 通過?件路徑加載并顯?圖?. 搭配 QPainter 的 drawPixmap()函數(shù), 可以把這個圖?繪制到?個 QLabel、QPushButton 等控件上. 和系統(tǒng)/顯?設(shè)備強相關(guān), 不同系統(tǒng)/顯?設(shè)備下, QPixmap 的顯?可能會有所差別.
QImage 的核?特性:
使? QPainter 直接在上?進?繪制圖形. 通過?件路徑加載并顯?圖?. 能夠針對圖?進?像素級別的操作(操作某個指定的像素). 獨?于硬件的繪制系統(tǒng), 能夠在不同系統(tǒng)之上提供?致的顯?.
QPicture 核?特性:
使? QPainter 直接在上?進?繪制圖形. 通過?件路徑加載并顯?圖?. 能夠記錄 QPainter 的操作步驟. 獨?于硬件的繪制系統(tǒng), 能夠在不同系統(tǒng)之上提供?致的顯?.
【注意】QPicture 加載的必須是??的存檔?件, ?不能是任意的 png, jpg 等圖??件.
柚子快報激活碼778899分享:開發(fā)語言 【Qt】繪圖API
推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。