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. }  
protected:
    void paintEvent(QPaintEvent *);

void Widget::paintEvent((QPaintEvent *event)
{
    QPainter painter(this); //this爲繪圖設備,即表明在該部件上進行繪製
    painter.drawLine(QPaint(0, 0), QPaint(100, 100));
}
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. }  
void Widget::paintEvent((QPaintEvent *event)
{
    QPainter painter;
    painter.begin(this);
    painter.drawLine(QPaint(0, 0), QPaint(100, 100));
    painter.end();
}
2. 使用畫刷
畫刷可以設置顏色和填充模式
  1. QBrush brush(QColor(0,0,255), Qt::Dense4Pattern);  
  2. painter.setBrush(brush);  
QBrush brush(QColor(0,0,255), Qt::Dense4Pattern);
painter.setBrush(brush);
3. 使用畫筆
  1. //參數爲:畫刷,線寬,畫筆風格,畫筆端點,畫筆連接風格  
  2. QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);  
  3. painter.setPen(pen);  
//參數爲:畫刷,線寬,畫筆風格,畫筆端點,畫筆連接風格
QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);
painter.setPen(pen);
4. 繪製矩形
  1. painter.drawRect(0, 0, 100, 80); //x,y,w,h  
painter.drawRect(0, 0, 100, 80); //x,y,w,h
5. 繪製橢圓(圓)
  1. painter.drawEllipse(0, 0, 100, 80); //x,y,w,h  
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);  
QRectF rect(70.0, 40.0, 80.0, 60.0); //x,y,w,h
int startAngle = 30 * 16; //值爲,實際角度 * 16
int spanAngle = 120 * 16;

//三個參數:rect表示弧線所在的矩形,startAngle起始角度,spanAngle跨越角度
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);  
QRectF rect_top(20.0, 20.0, 100.0, 100.0);

// 扇形起始角度
int startAngle = 0 * 16;
// 扇形覆蓋範圍(120度的)
int spanAngle = 120 * 16;
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);  
QPolygon pts;
pts.setPoints(3, -1,0, 1,0, 0,39); //第一個參數表示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);  
QPainterPath path;
path.addEllipse(-4, -4, 8, 8);//添加一個圓
path.addRect(-5, -5, 10, 10); //添加一個矩形
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);  
QPainterPath path;
path.addEllipse(0,0,100,100);
path.addEllipse(25,25,50,50);
painter.setBrush(Qt::blue);
path.setFillRule(Qt::OddEventFil);//使用奇偶填充,剛好可以只顯示圓環
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));  
//使用畫刷填充一個矩形區域
painter.fillRect(QRect(10,100,150,20), QBrush(Qt::darkYellow));

//擦除一個矩形區域的內容
painter.eraserRect(QRect(50,0,50,120));


以上轉載自: http://blog.csdn.net/lwbeyond/article/details/41479809

發佈了31 篇原創文章 · 獲贊 20 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章