Qt 基本圖形繪製
阿新 • • 發佈:2020-08-17
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));