目錄
初識繪圖
繪圖API的使用
繪制形狀(QPaintEvent)
繪制文字(畫筆QPen)
內部填充(畫刷QBrush)
繪制圖片(QPixmap)
初識繪圖
我們前面學習 Qt 主要是學 Qt 的各種控件,本質上都是畫出來的
都是一些常用的東西,Qt 已經提前畫好了,拿過來就能使用
實際開發中,很可能現有的控件無法滿足需求,就需要自己 diy 一些控件/效果
Qt 提供的 繪圖 API 就是為了解決上述問題的
實際開發中大部分情況下不需要使用 繪圖 API
繪圖API核心類:
畫圖相關的操作,一般不會放到 QWidget 的構造函數中調用執行,而是 Qt 提供了一個 paintEvent
事件處理函數,在這里進行調用
在出現下面的情況時,都能夠自動觸發到 QPaintEvent 事件:
- 1.控件首次創建的時候
比如往 QWidget 上畫畫
QWidget 創建之前,畫的東西當然不生效
首次創建 QWidget 就能顯示出畫的東西來 - 2.控件被遮擋, 再解除遮擋
這個時機進行繪制也是很重要的,否則繪制的內容就會在被遮擋之后就沒了 - 3.窗口被最小化,再還原
- 4.控件大小發生改變的時候
- 5.主動在代碼中調用 repaint 或者 update觸發事件.(都是 QWidget 提供的成員函數)
因此 paintEvent 函數也就能夠自動被調用
繪圖API的使用
繪制形狀(QPaintEvent)
在 widget.h 中需要重寫 PaintEvent 函數:
函數定義如下:
上述函數的注意事項:
- (void)event;是為了不報警告,因為下面的程序沒有用到參數 event
- 這是定義在棧上的變量,不需要考慮釋放的問題,此處指定的 this,不是 父對象,而是指定繪制的設備(往啥東西上畫)
- drawLine后面的參數表示起點和終點的橫縱坐標
此時效果為一條斜線:
也可以畫矩形:
效果為:
也可以畫圓形,前兩個參數表示圓心的位置坐標,后兩個參數表示圓的外接矩形的寬度和高度
正圓形:
橢圓形:
橢圓形的效果為:
繪制文字(畫筆QPen)
在上述畫形狀的地方改為下面的代碼,就可以繪制文字了:
注意理解這里的坐標的位置
此處的 0 橫坐標,表示的是 文字最左側的位置
此處的 100 縱坐標,表示的是文字的"基線位置"?(整個字從上到下大約第二個三等分點的位置),也就是下圖中紅色線的位置:
效果為:
如果覺得字體不符合預期,也可以設置字體和字體大小:
此時效果如下:
通過畫筆對象 QPen 設置繪制的形狀的顏色信息:
顏色、粗細、樣式
還可以設置樣式:
下面設置圓形的顏色、粗細、樣式:
效果為:
內部填充(畫刷QBrush)
畫刷QBrush 主要是起到內部填充的效果
除了顏色,還有風格:
在上述畫筆的代碼中,添加畫刷的相關代碼:
此時效果為:
上述是采用實心的方式填充的,下面采用其他方式填充:
?
效果為:
此時綠色填充中間就變為綠色的網格線了
繪制圖片(QPixmap)
Qt提供了四個類來處理圖像數據:Qlmage、QPixmap、QBitmap和 QPicture
它們都是常用的繪圖設備
- 其中Qlmage主要用來進行I/0 處理,它對I/0處理操作進行了優化,而且可以用來直接訪問和操作像素
- OPixmap 主要用來在屏幕上顯示圖像,它對在屏幕上顯示圖像進行了優化
- QBitmap是 QPixmap 的子類,用來處理顏色深度為1的圖像,即只能顯示黑白兩種顏色
- QPicture 用來記錄并重演 OPainter 命令
下面以 QPixmap 為例, 只講解 QPixmap
先創建一個項目,再創建 qrc 文件,將前面的 cat.png 導入進項目中
同樣重寫 paintEvent 函數:
效果為:
除了能進行基礎的繪制,還能進行圖片縮放:
- 100,100:指的是距離窗口左上角的偏移
- 400,300:指的是圖片縮放的長寬比例
效果為:
還可以進行圖片旋轉:
- painter.rotate(180) 是繞著 0,0 坐標系原點進行的旋轉,此時旋轉的效果看不到小貓圖片,因為已經旋轉到窗口外面了:
為了讓圖片能夠顯示出來,可以把坐標系原點(Painter 的起點) 平移一下 - painter.translate(-800, -600) 表示將原點平移到 -800,-600 的位置
因為原本的坐標系是向右和向下增長的, 現在旋轉180度變為向左和向上增長,想讓圖片顯示出來,就需要將圖片向右和向下平移,所以x和y需要減小,也就是 -800,-600,此時效果為:
運行程序,效果為:
Qt:繪圖API到此學習結束