qt实现秒表功能

最近项目里需要一个计时功能,可以实现暂停,继续,结束,开始的功能,如同秒表一样,我就写了一个demo,效果如图:
在这里插入图片描述
代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>
#include <QLCDNumber>
#include <QDateTime>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    void InitWidget();
    void InitConnect();
private:
    void slotPushButtonStart();
    void slotPushButtonPause();
    void slotPushButtonContinue();
    void slotPushButtonStop();
private:
    QTimer* m_timer=nullptr;
    QLCDNumber* m_displaytime=nullptr;
    QDateTime m_startclock, m_pausetime;
    qint64 m_pausedTime;
    QPushButton* PushButtonStart=nullptr;
    QPushButton* PushButtonPause=nullptr;
    QPushButton* PushButtonContinue=nullptr;
    QPushButton* PushButtonStop=nullptr;
};

#endif // WIDGET_H

#include "widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    InitWidget();
    InitConnect();
}

Widget::~Widget()
{
}

void Widget::InitWidget()
{
    QVBoxLayout* vlayout=new QVBoxLayout(this);
    QHBoxLayout* hlayout=new QHBoxLayout(this);

    m_displaytime = new QLCDNumber(this);
    m_displaytime->setDigitCount(8);
    m_displaytime->setMode(QLCDNumber::Dec);
    m_displaytime->resize(500, 100);
    m_displaytime->setSegmentStyle(QLCDNumber::Flat);
    m_displaytime->setStyleSheet("background:transparent;color:#000000;");
    m_displaytime->move(QPoint(28, 763));
    m_displaytime->display("00:00:00");

    PushButtonStart=new QPushButton(this);
    PushButtonPause=new QPushButton(this);
    PushButtonContinue=new QPushButton(this);
    PushButtonStop=new QPushButton(this);
    PushButtonStart->setText("开始");
    PushButtonStart->setFixedSize(150,80);
    PushButtonPause->setText("暂停");
    PushButtonPause->setFixedSize(150,80);
    PushButtonContinue->setText("继续");
    PushButtonContinue->setFixedSize(150,80);
    PushButtonStop->setText("结束");
    PushButtonStop->setFixedSize(150,80);
    vlayout->addWidget(m_displaytime);
    vlayout->addStretch();
    vlayout->addWidget(PushButtonStart);
    vlayout->addStretch();
    vlayout->addWidget(PushButtonPause);
    vlayout->addStretch();
    vlayout->addWidget(PushButtonContinue);
    vlayout->addStretch();
    vlayout->addWidget(PushButtonStop);
    vlayout->addStretch();

    this->setLayout(vlayout);

    m_timer = new QTimer(this);
    m_timer->setInterval(1000);
    connect(m_timer, &QTimer::timeout, [=] {
        QDateTime currentDateTime = QDateTime::currentDateTime();
        qint64 ms = m_startclock.msecsTo(currentDateTime);
        qint64 seconds = ms / 1000;
        qint64 minutes = seconds / 60;
        qint64 hours = minutes / 60;

        // 更新分钟和秒数,以处理进位
        minutes %= 60;
        seconds %= 60;

        // 格式化显示时间
        m_displaytime->display(QString("%1:%2:%3")
                               .arg(hours, 2, 10, QLatin1Char('0'))
                               .arg(minutes, 2, 10, QLatin1Char('0'))
                               .arg(seconds, 2, 10, QLatin1Char('0')));
    });
    setFixedSize(160,500);
    PushButtonContinue->setEnabled(false);
}

void Widget::InitConnect()
{
    connect(PushButtonStart,&QPushButton::clicked,this,&Widget::slotPushButtonStart);
    connect(PushButtonPause,&QPushButton::clicked,this,&Widget::slotPushButtonPause);
    connect(PushButtonContinue,&QPushButton::clicked,this,&Widget::slotPushButtonContinue);
    connect(PushButtonStop,&QPushButton::clicked,this,&Widget::slotPushButtonStop);
}

void Widget::slotPushButtonStart()
{
    m_timer->start();
    m_startclock = QDateTime::currentDateTime();
    m_displaytime->display("00:00:00");
    PushButtonPause->setEnabled(true);
}

void Widget::slotPushButtonPause()
{
    m_pausedTime = m_startclock.msecsTo(QDateTime::currentDateTime());
    m_timer->stop();
    PushButtonContinue->setEnabled(true);
    PushButtonStart->setEnabled(false);

}

void Widget::slotPushButtonContinue()
{
    m_startclock = QDateTime::currentDateTime().addMSecs(-m_pausedTime);
    m_timer->start();
}

void Widget::slotPushButtonStop()
{
    m_timer->stop();
    PushButtonPause->setEnabled(false);
    PushButtonStart->setEnabled(true);
    PushButtonContinue->setEnabled(false);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值