Qt 基本圖形繪制


1. 繪制圖形

1 protected: 2     void paintEvent(QPaintEvent *); 3  
4 void Widget::paintEvent((QPaintEvent *event) 5 { 6     QPainter painter(this); //this為繪圖設備,即表明在該部件上進行繪制
7     painter.drawLine(QPaint(0, 0), QPaint(100, 100)); 8 }

QPainter painter(this); // 會立即開始在設備上繪制,自動調用begin()函數,然后析構函數中調用end()函數結束繪制。
QPainter painter;// 不帶參數時,可以在后面調用QPainter::begin(QPaintDevice *device)來指定繪制設置,然后用完再調用end()函數。
等價於

1 void Widget::paintEvent((QPaintEvent *event) 2 { 3  QPainter painter; 4     painter.begin(this); 5     painter.drawLine(QPaint(0, 0), QPaint(100, 100)); 6  painter.end(); 7 }

2. 使用畫刷
畫刷可以設置顏色和填充模式

1 QBrush brush(QColor(0,0,255), Qt::Dense4Pattern); 2 painter.setBrush(brush);

3. 使用畫筆

1 //參數為:畫刷,線寬,畫筆風格,畫筆端點,畫筆連接風格
2 QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin); 3 painter.setPen(pen);

4. 繪制矩形

painter.drawRect(0, 0, 100, 80); //x,y,w,h

5. 繪制橢圓(圓)

1 painter.drawEllipse(0, 0, 100, 80); //x,y,w,h

6. 繪制圓弧

1 QRectF rect(70.0, 40.0, 80.0, 60.0); //x,y,w,h
2 int startAngle = 30 * 16; //值為,實際角度 * 16
3 int spanAngle = 120 * 16; 4  
5 //三個參數:rect表示弧線所在的矩形,startAngle起始角度,spanAngle跨越角度
6 painter.drawArc(rect, startAngle, spanAngle);


7. 繪制扇形

1 QRectF rect_top(20.0, 20.0, 100.0, 100.0); 2  
3 // 扇形起始角度
4 int startAngle = 0 * 16; 5 // 扇形覆蓋范圍(120度的)
6 int spanAngle = 120 * 16; 7 painter.drawPie(rect_top, startAngle, spanAngle);

8. 繪制多邊形

1 QPolygon pts; 2 pts.setPoints(3, -1,0, 1,0, 0,39); //第一個參數表示3個點,后面是三個點坐標
3 painter.drawConvexPolygon(pts);

9. 繪制路徑

1 QPainterPath path; 2 path.addEllipse(-4, -4, 8, 8);//添加一個圓
3 path.addRect(-5, -5, 10, 10); //添加一個矩形
4 painter.drawPath(path);

在填充路徑時要用到填充規則,這里一共有兩個填充規則
path.setFillRule(Qt::OddEventFil);//奇偶填充規則
如果要判斷一個點是否在圖形中,可以從該點向圖形外引一條水平線,如果該水平線與圖形的交點人個數為奇數,那么該點在在圖形中。
只填充在圖形內的點
path.setFillRule(Qt::WindingFill); //非零彎曲規則
如果要判斷一個點是否在圖形中,可以從該點向圖形外引一條水平線,如果該水平線與圖形的邊線相交,這個邊線是順時針繪制的,就記為1,是逆時針繪制的就記為-1,然后將所有數值相加,結果不為0,那么該點就在圖形中。


10. 繪制圓環
根據以上的填充規則,可以得到繪制圓環的一個方便的方法

1 QPainterPath path; 2 path.addEllipse(0,0,100,100); 3 path.addEllipse(25,25,50,50); 4 painter.setBrush(Qt::blue); 5 path.setFillRule(Qt::OddEventFil);//使用奇偶填充,剛好可以只顯示圓環
6 painter.drawPath(path);

11. 填充與擦除

1 //使用畫刷填充一個矩形區域
2 painter.fillRect(QRect(10,100,150,20), QBrush(Qt::darkYellow)); 3  
4 //擦除一個矩形區域的內容
5 painter.eraserRect(QRect(50,0,50,120));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM