用qt写一个简易时钟

用qt做一个简易的时钟,主要涉及到qt中的定时器事件,画图事件

"widget.h"

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    void paintEvent(QPaintEvent *event);
    void timerEvent(QTimerEvent *event);

private:
    int h = 0, m = 0, s = 0;   //定义三个变量来存储时,分,秒
    int timer;   //存储计时器返回的序号
};

“widget.cpp”

1、构造函数中初始化定时器,并用currentTime方法访问系统当前时间,存储到定义的变量中

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{

    timer = startTimer(1000);
    QTime nowtime = QTime::currentTime();
    h = nowtime.hour();
    m = nowtime.minute();
    s = nowtime.second();
}

2、构造定时器事件

 void Widget::timerEvent(QTimerEvent *event)
 {
     s++;
     if (s == 60)
        {
            s = 0;
            m++;

            if (m == 60)
            {
                m = 0;
                h++;

                if (h == 24)
                {
                    h = 0;
                }
            }
        }
 }

掌握时间中进制转换的规律,对时分秒进行转换即可

1day = 24h        1h = 60m        1m = 60s        (每个单位进位以后记得归零

3、构造绘图事件

 void Widget::paintEvent(QPaintEvent *event)
 {
     QPainter painter(this);  //必须在绘图事件中定义才会被激活
     painter.setRenderHint(QPainter::Antialiasing,true);  //消除锯齿
     QPen mypen(Qt::black,3);  //构建一只画笔mypen
     painter.setPen(mypen);   //使用画笔
     QPoint center(this->width()/2,this->height()/2);   //定点到画布的中心位置
     painter.translate(center);     //利用translate函数将原点定位到中心位置
     QPoint cen(0,0);
     //painter.drawEllipse(cen,200,200);   //绘制时钟的外围
     
     //绘制小时的刻度线
     for(int i=0;i<12;i++)  
     {
         painter.rotate(30);
         painter.drawLine(0,-180,0,-200);
     }

    //绘制分钟的刻度线
     for(int i=0;i<60;i++)
     {
         painter.rotate(6);
         painter.drawLine(0,-190,0,-200);
     }
     painter.end();

     QPainter painters(this);  //定义一个画家来控制秒针
     painters.setRenderHint(QPainter::Antialiasing,true);
     mypen.setWidth(1);

     painters.setPen(mypen);
     painters.translate(center);
     painters.rotate(s*6);  //秒针每次转6°
     painters.drawLine(0,0,0,-150);  //画出秒针
     painters.end();

     QPainter painterm(this);  //定义一个画家来控制分针
     painterm.setRenderHint(QPainter::Antialiasing,true);
     mypen.setWidth(4);
     mypen.setColor(Qt::blue);
     painterm.setPen(mypen);
     painterm.translate(center);
     painterm.rotate(m*6);  //分针每次转6°(一小格)
     painterm.drawLine(0,0,0,-150);
     painterm.end();

     QPainter painterh(this);  //定义一个画家来控制时针
     painterh.setRenderHint(QPainter::Antialiasing,true);
     mypen.setWidth(7);
     mypen.setColor(Qt::red);
     painterh.setPen(mypen);
     painterh.translate(center);
     painterh.rotate(h*30+m*0.5);  //时针每小时偏移30°并在原来的基础上每分钟偏移0.5°
     painterh.drawLine(0,0,0,-100);
     painterh.end();

     update();  //刷新绘图事件
 }

一定要用update来不断刷新绘图事件才会呈现出动态效果

效果图展示:

 

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值