- protected:
- void paintEvent(QPaintEvent *);
- void Widget::paintEvent((QPaintEvent *event)
- {
- QPainter painter(this); //this爲繪圖設備,即表明在該部件上進行繪製
- painter.drawLine(QPaint(0, 0), QPaint(100, 100));
- }
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()函數。
等價於
- void Widget::paintEvent((QPaintEvent *event)
- {
- QPainter painter;
- painter.begin(this);
- painter.drawLine(QPaint(0, 0), QPaint(100, 100));
- painter.end();
- }
void Widget::paintEvent((QPaintEvent *event)
{
QPainter painter;
painter.begin(this);
painter.drawLine(QPaint(0, 0), QPaint(100, 100));
painter.end();
}
2. 使用畫刷畫刷可以設置顏色和填充模式
- QBrush brush(QColor(0,0,255), Qt::Dense4Pattern);
- painter.setBrush(brush);
QBrush brush(QColor(0,0,255), Qt::Dense4Pattern);
painter.setBrush(brush);
3. 使用畫筆- //參數爲:畫刷,線寬,畫筆風格,畫筆端點,畫筆連接風格
- QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);
- painter.setPen(pen);
//參數爲:畫刷,線寬,畫筆風格,畫筆端點,畫筆連接風格
QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);
painter.setPen(pen);
4. 繪製矩形- painter.drawRect(0, 0, 100, 80); //x,y,w,h
painter.drawRect(0, 0, 100, 80); //x,y,w,h
5. 繪製橢圓(圓)- painter.drawEllipse(0, 0, 100, 80); //x,y,w,h
painter.drawEllipse(0, 0, 100, 80); //x,y,w,h
6. 繪製圓弧- 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);
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. 繪製扇形
- 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);
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. 繪製多邊形- QPolygon pts;
- pts.setPoints(3, -1,0, 1,0, 0,39); //第一個參數表示3個點,後面是三個點座標
- painter.drawConvexPolygon(pts);
QPolygon pts;
pts.setPoints(3, -1,0, 1,0, 0,39); //第一個參數表示3個點,後面是三個點座標
painter.drawConvexPolygon(pts);
9. 繪製路徑- QPainterPath path;
- path.addEllipse(-4, -4, 8, 8);//添加一個圓
- path.addRect(-5, -5, 10, 10); //添加一個矩形
- 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. 繪製圓環
根據以上的填充規則,可以得到繪製圓環的一個方便的方法
- 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);
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. 填充與擦除- //使用畫刷填充一個矩形區域
- painter.fillRect(QRect(10,100,150,20), QBrush(Qt::darkYellow));
- //擦除一個矩形區域的內容
- 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