Qt绘制简易时钟

新建GUI应用,基类为QWidget。

在widget.h文件中声明printEvent()函数:

protected: 
     void paintEvent(QPaintEvent *);

    在widget.cpp文件中实现printEvent()函数:


void Widget::paintEvent(QPaintEvent *)
{
    setWindowTitle(tr("时钟"));
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    QPen pen;
    pen.setColor(Qt::black);
    pen.setWidth(8);
    pen.setStyle(Qt::SolidLine);
    painter.setPen(pen);//使用画笔
    painter.setBrush(QColor(0,0,0,100));
    painter.drawEllipse(width()/2-100,height()/2-100,200,200);//使表盘始终居中

    QPen pen1;
    pen1.setWidth(1);
    QPen pen2;
    pen1.setWidth(3);
    painter.translate(width()/2,height()/2);
    for(int i=0;i<60;i++)//绘制表盘刻度
    {
        if(i%5!=0)//绘制短刻度线
        {
            painter.setPen(pen2);
            painter.drawLine(100,0,90,0);
        }
        else//绘制长刻度线
        {
            painter.setPen(pen1);
            painter.drawLine(100,0,85,0);
        }
        painter.rotate(6.0);
    }

    painter.save();
    //绘制文字
    QFont font("宋体",16,QFont::Bold);//设置字体样式
    //使用字体
    painter.setFont(font);
    painter.setPen(Qt::black);
    painter.drawText(65,8,tr("3"));
    painter.drawText(-75,8,tr("9"));
    painter.drawText(-13,-60,tr("12"));
    painter.drawText(-5,75,tr("6"));
    painter.setPen(QColor(233,195,65));
    painter.drawText(-30,-40,tr("Rolex"));
 painter.save();

    QTimer *timer=new QTimer(this);//声明一个定时器
    connect(timer,SIGNAL(timeout()),this,SLOT(update()));
    timer->start(1000.0);

    QTime time=QTime::currentTime();

    //根据个点坐标画针分针秒针
     QPoint hourHand[5] = {QPoint(-3,10),QPoint(3,10),QPoint(3,-45),QPoint(0,-60),QPoint(-3,-45) };

     QPoint minuteHand[2] = {QPoint(0,20),QPoint(0,-70)};

     QPoint secondHand[2] = {QPoint(0,30),QPoint(0,-90)};

    //绘制时针
    QPen penh;
    penh.setWidthF(1);
    painter.setPen(penh);

    painter.setBrush(Qt::black);
    painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));//坐标轴旋转的角度
    painter.drawConvexPolygon(hourHand,5);//根据三个坐标点绘图
    painter.restore();

    //绘制分针
    QPen penm;
    penm.setColor(Qt::green);
    penm.setWidthF(2);
    painter.setPen(penm);
    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
    painter.drawConvexPolygon(minuteHand, 2);
    painter.restore();//恢复保存前状态

    //绘制秒针
    QPen pens;
    pens.setColor(Qt::red);
    pens.setWidthF(1);
    painter.setPen(pens);
    painter.setBrush(Qt::red);

    painter.rotate(6.0*time.second());
    painter.drawConvexPolygon(secondHand,2);
    painter.restore();

    //绘制秒针上的两个红点
    painter.drawEllipse(-5,15,10,10);
    painter.drawEllipse(-3,-75,6,6);
   //绘制中心黑点
    painter.setPen(Qt::black);
    painter.setBrush(Qt::black);
    painter.drawEllipse(-6,-6,12,12);
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值