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