__QPainter___操作



QT__QPainter___操作
说明: 程序是转载,分析是自己的
/*
前沿:
同很多坐标系统一样,QPainter的默认坐标的原点(0, 0)位于屏幕的左上角,X轴正方向是水平向右,Y轴正方向是竖直向下。在这个坐标系统中,每个像素占据1 x 1的空间。你可以把它想象成是一张坐标值,其中的每个小格都是1个像素。这么说来,一个像素的中心实际上是一个“半像素坐标系”,也就是说,像素(x, y)的中心位置其实是在(x + 0.5, y + 0.5)的位置上。因此,如果我们使用QPainter在(100, 100)处绘制一个像素,那么,这个像素的中心坐标是(100.5, 100.5)。
*/
    painter =new QPainter(this);
    painter->setRenderHint(QPainter::Antialiasing, true); //反锯齿
    int cx,cy;
    int r;

    cy =height()/2;/*取的当前layout的宽和高,作为半径,圆心和半径*/
    cx =width()/2;
    r=cy>cx?cx:cy-20; //留边框
    painter->translate(QPoint(cx,cy));//QPainter默认当前layout左上角的实际0,0点为坐标原点,这里重新定位一下,定位到layout的中心为0,0点。

    painter->setPen(QColor(51,153,204)); /*画表盘*/
    painter->drawEllipse(QPoint(0,0),r,r);//中心点 两个坐标r,r,都一样说明是圆
 //----------------------------上面是绘制圆----------------------

    painter->save(); /*保存painter状态*/
    QPoint point1,point2;
    /*画刻度*/
    for(int i =1;i <=60;i++)
    {
         painter->rotate(6);
         if(i%5 == 0)
            painter->setPen(QColor(251,50,153));
         else
            painter->setPen(QColor(51,153,204));

            painter->drawLine(QPoint(0,r), i%5?QPoint(0,r*0.95):QPoint(0,r*0.90));
    }
    painter->restore();
    /*画数字*/
    painter->setPen(QColor(50,0,255));
    for(int i =1;i <=12;i++)
    {
         point2.setX(sin((float)i/12*(2*3.14))*r*0.8 -5);
         point2.setY(-(cos((float)i/12*(2*3.14))*r*0.8-5));
         painter->drawText(point2,QString::number(i));
    }
    /*定义指针形状*/
    QPoint hourHand[3] =
    {
        QPoint(r*0.1, r*0.1),
        QPoint(-r*0.1, r*0.1),
        QPoint(0, -r*0.6)
    };
    QPoint minuteHand[3] = {
        QPoint(r*0.1, r*0.1),
        QPoint(-r*0.1, r*0.1),
        QPoint(0, -r*0.8)
    };
    QPoint secondHand[3] = {
        QPoint(r*0.1, r*0.1),
        QPoint(-r*0.1, r*0.1),
        QPoint(0, -r*0.9)
    };
    painter->setPen(Qt::NoPen);

    /*画时针*/
    painter->save();
    painter->setBrush(QColor(0,0,255,230));  //设置画刷的颜色。

    painter->rotate((float)
                    (time.hour() +   (float)time.minute()/60)
                    /12
                    *360);//顺时针 旋转 角度 (360度分12份*当前小时数=角度) 12点为0度  旋转十字架
    painter->drawConvexPolygon(hourHand, 3);//convex 凸polygon 多边形  这个坐标十字架 已经旋转,再次以一个旋转后的十字架来做0,0 绘制一个多边形,就有了四个像限 有了正负。这样就有了指针。
    painter->restore();
     /*画分针*/   //下面类似。

    painter->save();
    painter->setBrush(QColor(0,255,0,200));
    painter->rotate((float)(time.minute()+(float)time.second()/60)/60*360);
    painter->drawConvexPolygon(minuteHand, 3);
    painter->restore();
    /*画秒针*/
    painter->save();
    painter->setBrush(QColor(255,0,0,240));
    painter->rotate((float)time.second()/60*360);
    painter->drawConvexPolygon(secondHand, 3);
    painter->restore();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值