1. 绘制图形

[cpp]  view plain  copy

1. protected:  
2. void paintEvent(QPaintEvent *);  
3.   
4. void Widget::paintEvent((QPaintEvent *event)  
5. {  
6. this); //this为绘图设备,即表明在该部件上进行绘制  
7.     painter.drawLine(QPaint(0, 0), QPaint(100, 100));  
8. }


QPainter painter(this); // 会立即开始在设备上绘制,自动调用begin()函数,然后析构函数中调用end()函数结束绘制。


QPainter painter;// 不带参数时,可以在后面调用QPainter::begin(QPaintDevice *device)来指定绘制设置,然后用完再调用end()函数。



等价于


[cpp]  view plain  copy

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


    2. 使用画刷


    画刷可以设置颜色和填充模式


    [cpp]  view plain  copy     

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


    3. 使用画笔


    [cpp]  view plain  copy     

    1. //参数为:画刷,线宽,画笔风格,画笔端点,画笔连接风格  
    2. QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);  
    3. painter.setPen(pen);

     


    4. 绘制矩形


    [cpp]  view plain  copy

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


      5. 绘制椭圆(圆)


      [cpp]  view plain  copy

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


        6. 绘制圆弧


        [cpp]  view plain  copy

        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);


        qt QGraphicsPathItem绘制 qt画图_Qt


        7. 绘制扇形


        [cpp]  view plain  copy

        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. 绘制多边形


        [cpp]  view plain  copy

          1. QPolygon pts;  
          2. pts.setPoints(3, -1,0, 1,0, 0,39); //第一个参数表示3个点,后面是三个点坐标  
          3. painter.drawConvexPolygon(pts);


          9. 绘制路径


          [cpp]  view plain  copy

          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,那么该点就在图形中。


          qt QGraphicsPathItem绘制 qt画图_析构函数_02



          10. 绘制圆环


          根据以上的填充规则,可以得到绘制圆环的一个方便的方法


          [cpp]  view plain  copy

          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. 填充与擦除


          [cpp]  view plain  copy

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