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