閱讀734 返回首頁    go 小米 go 小米6


[Qt教程] 第11篇 2D繪圖(一)繪製簡單圖形

[Qt教程] 第11篇 2D繪圖(一)繪製簡單圖形

樓主
 發表於 2013-4-23 12:52:35 | 查看: 1398| 回複: 5
繪製簡單圖形

版權聲明

該文章原創於Qter開源社區,作者yafeilinux,轉載請注明出處!



導語

Qt中提供了強大的2D繪圖係統,可以使用相同的API在屏幕和繪圖設備上進行繪製,它主要基於QPainter、QPaintDevice和QPaintEngine這三個類。其中QPainter用來執行繪圖操作;QPaintDevice提供繪圖設備,它是一個二維空間的抽象,可以使用QPainter在其上進行繪製;QPaintEngine提供了一些接口,可以用於QPainter在不同的設備上進行繪製。
在繪圖係統中由QPainter來完成具體的繪製操作,QPainter類提供了大量高度優化的函數來完成GUI編程所需要的大部分繪製工作。QPainter可以繪製一切想要的圖形,從最簡單的一條直線到其他任何複雜的圖形,它還可以用來繪製文本和圖片。QPainter可以在繼承自QPaintDevice類的任何對象上進行繪製操作。
       QPainter一般在一個部件的重繪事件(Paint Event)的處理函數paintEvent()中進行繪製,首先要創建QPainter對象,然後進行圖形的繪製,最後銷毀QPainter對象。


環境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2




目錄

一、繪製一條直線
二、畫筆和畫刷
三、繪製弧線




正文


一、繪製一條直線


1.新建Qt Gui應用,項目名稱為painter_1,類信息界麵不用修改,即類名為MainWindow,基類為QMainWindow

2.mainwindow.h文件中添加重繪事件處理函數的聲明:
protected:
void paintEvent(QPaintEvent *);
所有的繪製操作都要在這個函數裏麵完成。

3.下麵到mainwindow.cpp文件中先需要添加頭文件包含:
#include <QPainter>
然後添加該函數的定義:
void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawLine(QPointF(0, 0), QPointF(100, 100));
}
       這裏首先為該部件創建了一個QPainter對象,用於後麵的繪製。然後使用drawLine()函數繪製了一條線段,線段的起點為(0, 0),終點為(100, 100) ,這裏的單位是像素。效果如下圖所示。
11-1.jpg

可以看到,在Qt窗口裏麵,(0, 0)點就是窗口的左上角,但這裏是不包含外邊框的。而在MainWindow主窗口裏麵繪製時,左上角並不是指中心區域的左上角,而是包含了工具欄。

4.我們將光標定位到QPainter類名上,然後按下鍵盤上的F1按鍵,這時會自動跳轉到該類的幫助頁麵。當然,也可以到幫助模式,直接索引查找該類名。在幫助裏麵我們可以看到很多相關的繪製函數,如下圖所示。
11-2.jpg


5.我們任意點擊一個函數名,就會跳轉到該函數的介紹段落。例如我們點擊drawEllipse()函數,就跳轉到了該函數的介紹處,上麵還提供了一個例子。如下圖所示。我們可以直接將例子裏麵的代碼複製到paintEvent()函數裏麵,測試效果。
11-3.jpg



二、畫筆和畫刷


1.我們先將paintEvent()函數的內容更改如下:
void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPen pen; //畫筆
    pen.setColor(QColor(255, 0, 0));
    QBrush brush(QColor(0, 255, 0, 125)); //畫刷
    painter.setPen(pen); //添加畫筆
    painter.setBrush(brush); //添加畫刷
    painter.drawRect(50, 50, 200, 100); //繪製矩形
}
    這裏分別新建了一個畫筆QPen,和畫刷QBrush。其中畫筆使用了setColor()函數為其設置了顏色,而畫刷是在構建的時候直接為其設置的顏色。這裏的顏色都是使用的QColor類提供的,裏麵如果是三個參數,那麼分別是紅、綠、藍分量的值,也就是經常說的rgb,取值範圍都是0-255,比如這裏的(255, 0, 0)就表明紅色分量為255,其他分量為0,那麼出來就是紅色。如果是四個參數,最後一個參數alpha是設置透明度的,取值範圍也是0-255,0表示完全透明,而255表示完全不透明。
    然後我們將畫筆和畫刷設置到了painter上,並使用drawRect()繪製了一個矩形,其左上角頂點在(50, 50),寬為200,高為100。運行程序,效果如下圖所示。
11-4.jpg

2.畫筆還有許多其他的設置,可以查看該類的幫助文檔。例如,可以使用pen.setStyle()來設置畫筆樣式,可用的畫筆樣式如下圖所示。
11-5.jpg


3.畫刷也有很多其他設置,這個也可以查看其幫助文檔。在Qt中為畫刷提供了一些可用的樣式,可以使用setStyle()函數來設置。如下圖所示。
11-6.jpg


這裏麵包含了漸變填充效果,這個會在下一節講到。

4.下麵我們寫一個簡單的例子演示一下。將paintEvent()函數更改如下:
void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPen pen(Qt::DotLine);
    QBrush brush(Qt::blue);
    brush.setStyle(Qt::HorPattern);
    painter.setPen(pen);
    painter.setBrush(brush);
    painter.drawRect(50,50,200,200);
}
       這裏的顏色使用了Qt預定義的顏色,可以在幫助中索引Qt::GlobalColor關鍵字查看。如下圖所示。
11-7.jpg


       現在運行程序,效果如下圖所示。

11-8.jpg



三、繪製弧線

       為了幫助大家學習,這裏再舉一個繪製弧線的例子,其實在幫助文檔中已經給出了這個例子。如下圖所示。
11-9.jpg

我們將paintEvent()函數更改如下:
void MainWindow::paintEvent(QPaintEvent *)
{
    QRectF rectangle(10.0, 20.0, 80.0, 60.0); //矩形
    int startAngle = 30 * 16;     //起始角度
    int spanAngle = 120 * 16;   //跨越度數
    QPainter painter(this);
    painter.drawArc(rectangle, startAngle, spanAngle);
}
這裏要說明的是,畫弧線時,角度被分成了十六分之一,就是說,要想為30度,就得是30*16。它有起始角度和跨度,還有位置矩形,要想畫出自己想要的弧線,就要有一定的幾何知識了。這裏就不再祥述。



結語

       這一節我們隻是簡單介紹了一下怎麼使用QPainter在窗口界麵上進行繪製,還涉及到了畫筆、畫刷,以及使用幫助文檔的一些內容。如果要更加係統、詳細的學習這些基礎知識,可以查看《Qt Creator快速入門》的第10章。



最後更新:2017-04-03 14:54:08

  上一篇:go 起泡排序【模板】
  下一篇:go 劍指Offer之二進製中1的個數