qt 时钟绘制

Qt 的绘制,首先看Qt文档:
The common use of QPainter is inside a widget’s paint event: Construct and customize (e.g. set the pen or the brush) the painter. Then draw. Remember to destroy the QPainter object after drawing. For example:
大致意思如下:
Qt画家通常的用法是在一个部件事件中;构造和定制的。
void MainWindow::paintEvent(QPaintEvent *event)

//创建当前时间,在以后的时钟显示的时候,有用。
QTime time=QTime::currentTime(); 
QPainter painter(this);

//画一个从坐标90,90,开始的园,直径为180。
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setBrush(QBrush(Qt::darkGray,Qt::SolidPattern));
painter.drawEllipse(90,90,180,180);    

//创建一个锥形梯度,原点,焦点,都是180,180,-90代表向下的圆锥。
QRadialGradient radgrient(180,180,-90,180,180);
radgrient.setColorAt(0.0,Qt::darkGray); 
radgrient.setColorAt(0.2,Qt::white);
radgrient.setColorAt(0.3,Qt::cyan);
radgrient.setColorAt(1.0,Qt::white);

//画一个从坐标100,100,开始的圆,直径为160,这样做是为了,让时钟外围有一个圆环包围。
仅仅是为了美观而已。
painter.setBrush(radgrient);
painter.drawEllipse(100,100,160,160);
//世界坐标转换,这样做的意思就是将坐标系建在180,180,的位置。这个时候这个点的实质的坐标是0,0.
painter.translate(180,180);
painter.save();
//开始绘制时针,分针,秒针的颜色。
参数以此为,red,green,blue,和透明度。
QColor hour(200,10,50,150);
QColor min(10,100,100,150);
QColor sec(10,10,200,150);

//绘制分针刻度线
for (int i=1;i<=60;i++)
{
    //绘制5个像素点长度的刻度线
        painter.drawLine(0,-80,0,-75); //这个时候可以看上面的世界坐标转换。圆心坐标180,180,为坐标系原点,
        他的上方,和左边为负数,右边,和下面为整数。好好思考。应该可以理解
        painter.rotate(6); //一分钟,或者一秒旋转6度。其实本质是坐标系旋转6度。
}
// painter.setPen(hour);
//绘制时针刻度线
for (int i=1;i<=60;i++)
{
    if(i%5==0)
    {
     //绘制5个像素点长度的刻度线
        painter.setPen(Qt::red|Qt::cyan);
        painter.drawLine(0,-80,0,-70);
        painter.rotate(30);
        painter.setPen(Qt::red|Qt::blue);
        //在-3,-60,的位置添加每个刻度代表的数字。其实位置应该是0,-60,为了美观,位置有些偏差。
       //tr("%1").arg(i/5)这个函数,是将数字转换成个字符串,默认情况,是以10进制转换.具体看Qt文档
        painter.drawText(-3,-60, tr("%1").arg(i/5));
    }

}
painter.restore();
//绘制时针,分针,秒针的形状。四个坐标,那就是四边形。注意坐标一定要按顺序写,不然是一个不规则的形状。
QPoint  handhour[4]={
    QPoint(0,-40),
    QPoint(3,0),
    QPoint(0,6),
    QPoint(-3,0),

};
QPoint  handsec[4]={
    QPoint(0,-60),
    QPoint(3,0),
    QPoint(0,6),
    QPoint(-3,0),

};
QPoint  handmin[4]={
    QPoint(0,-50),
    QPoint(3,0),
    QPoint(0,6),
    QPoint(-3,0),

};
//显示时针的位置
painter.setPen(Qt::NoPen);
painter.setBrush(hour);
painter.save();
painter.rotate(30.0*(time.hour()+time.minute()/60));
painter.drawConvexPolygon(handhour,4); //绘制多边形函数。
painter.restore();//切记旋转之后,一定要复位,不然,分针的旋转会在时针的基础上旋转。

//显示分针的位置
painter.setPen(Qt::NoPen);
painter.setBrush(min);
painter.save();
painter.rotate(6.0*(time.minute()+time.second()/60));
painter.drawConvexPolygon(handmin,4);
painter.restore();
//显示秒针位置
painter.setPen(Qt::NoPen);
painter.setBrush(sec);
painter.save();
painter.rotate(time.second()*6);
painter.drawConvexPolygon(handsec,4);
painter.restore();

}


        主函数

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//设置一个定时器,超过1000毫秒时,发射timeout()信号,触发update()槽函数。进行时间更新
QTimer *time=new QTimer;
time->start(1000);
connect(time,SIGNAL(timeout()),this,SLOT(update()));
}

MainWindow::~MainWindow()
{
delete ui;
}运行图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值