zoukankan      html  css  js  c++  java
  • 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));
  • 相关阅读:
    2-3树
    B树
    负载均衡的算法种类
    String源码分析
    实现一个List集合中的某个元素的求和
    就是通过事件方法,在window.loaction.href里追加了参数字符串
    九大内置对象及四个域对象的总结
    BigDecimal add方法问题:调用add后,求和结果没变
    java中List元素移除元素的那些坑
    Java序列化和反序列化,你该知道得更多
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13516088.html
Copyright © 2011-2022 走看看