__QPainter___操作

来源:互联网 发布:千锋教育云计算 编辑:程序博客网 时间:2024/06/05 06:21
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();}