[Qt教程] 第14篇 2D繪圖(四)繪製路徑
樓主
發表於 2013-4-27 12:40:52 | 查看:
611| 回複: 0

繪製路徑
版權聲明
該文章原創於Qter開源社區(www.qter.org),作者yafeilinux,轉載請注明出處!
導語
如果要繪製一個複雜的圖形,尤其是要重複繪製這樣的圖形,那麼可以使用QPainterPath類,然後使用QPainter::drawPath()來進行繪製。QPainterPath類為繪製操作提供了一個容器,可以用來創建圖形並且重複使用。一個繪圖路徑就是由多個矩形、橢圓、線條或者曲線等組成的對象,一個路徑可以是封閉的,例如矩形和橢圓;也可以是非封閉的,例如線條和曲線。
環境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2
目錄
一、簡單的使用路徑
二、複製圖形
三、繪製圖形時的當前位置
正文
一、簡單的使用路徑
依然在前麵的項目中進行講解。更改paintEvent()函數如下:
void MainWindow::paintEvent(QPaintEvent *)
{
QPainterPath path;
path.addEllipse(100, 100, 50, 50);
path.lineTo(200, 200);
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setBrush(Qt::red);
painter.drawPath(path);
}
當創建一個QPainterPath對象後,可以使用lineTo()、arcTo()、cubicTo()和quadTo()等函數將直線或者曲線添加到路徑中。運行程序,效果如下圖所示。
![]() 二、複製圖形
如果隻是簡單的將幾個圖形拚接在一起,其實完全沒有必要用路徑,之所以要引入路徑,就是因為它的一個非常有用的功能:複製圖形路徑。我們在painEvent()函數中繼續添加下麵幾行代碼:
QPainterPath path2;
path2.addPath(path);
path2.translate(100,0);
painter.drawPath(path2);
現在運行程序,效果如下圖所示。
![]() 可以看到,對於已經繪製好的路徑,可以非常簡單的進行重複繪製。
三、繪製圖形時的當前位置
1.我們先來看個例子,將paintEvent()函數更改如下:
void MainWindow::paintEvent(QPaintEvent *)
{
QPainterPath path;
path.lineTo(100,100);
path.lineTo(200,100);
QPainter painter(this);
painter.drawPath(path);
}
程序運行效果如下圖所示。
![]() 可以看到,創建路徑後,默認是從(0, 0)點開始繪製的,當繪製完第一條直線後當前位置是(100, 100)點,從這裏開始繪製第二條直線。繪製完第二條直線後,當前位置是(200,100)。
2.再來看一個例子。將paintEvent()函數的內容更改如下:
void MainWindow::paintEvent(QPaintEvent *)
{
QPainterPath path;
path.addRect(50, 50, 40, 40);
path.lineTo(200, 200);
QPainter painter(this);
painter.drawPath(path);
}
運行程序,效果如下圖所示。
![]() 可以發現,當繪製完矩形後,當前位置在矩形的左上角頂點,然後從這裏開始繪製後麵的直線。
4.我們也可以使用moveTo()函數來改變當前點的位置。例如將上麵的代碼更改為:
void MainWindow::paintEvent(QPaintEvent *)
{
QPainterPath path;
path.addRect(50, 50, 40, 40);
//移動到(100,
100)點
path.moveTo(100, 100);
path.lineTo(200, 200);
QPainter painter(this);
painter.drawPath(path);
}
這樣當繪製完矩形以後,就會移動到(100, 100)點進行後麵的繪製。程序運行效果如下圖所示。
![]() 結語
這裏隻講解了QPainterPath最基本的應用,使用好這個類可以繪製出很多特效圖形。如果繪製的兩個圖形有交集,那麼還要涉及到相交部分的填充規則問題,這部分內容可以參考《Qt
Creator快速入門》第10章的相關內容。
涉及到的源碼下載: ![]() |
最後更新:2017-04-03 14:54:15
上一篇:
[Qt教程] 第33篇 網絡(三)FTP(一)
下一篇:
[Qt教程] 第17篇 2D繪圖(七)塗鴉板
500強上市公司:研發模式互聯網轉型實踐
centos 網易yum源出錯解決辦法 mark
為ie中不支持的元素添加樣式
遊戲安全資訊精選 2017年 第三期:遊戲行業DDoS攻擊上周加重,Xshell後門事件原創分析報告,微軟“8月周二補丁日”全盤點
Coursera Scala 4-3:子類型和泛型
智能馬桶蓋在天貓賣爆,鬆下“蓋神”掌舵後做了一個決定......
Facebook引發的HTML5危機
Flink 原理與實現:Operator Chain原理
Infrastructure as Code――Kubernetes一鍵編排實踐
ListView中CheckBox 用程序全選的解決方案