QT入门——制作一个倒计时器


  最近看了一种番茄学习法,大意是认真工作/学习25分钟,然后休息五分钟。在网上找了一圈发现没有特别好用的倒计时器下载,于是自己写了一个,取名番茄钟。代码量很小,直接贴了吧。

  • 工程目录如图所示

   .pro文件没什么需要注意的,QT会自动给加进去;

  • mainwindow.h文件:主要是开始/结束按键和更新时间的槽函数、以及一些变量的声明。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void updateTime();

    void on_pbStart_clicked();

    void on_pbEnd_clicked();

private:
    Ui::MainWindow *ui;
    QTimer *timer;
    int m_secCnt;
    int m_minCnt;
    bool isStart;
};
#endif // MAINWINDOW_H
  • main.cpp文件:此处添加保持和取消窗口在前的语句,默认取消。
#include "mainwindow.h"

#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowFlags(w.windowFlags() | Qt::WindowStaysOnTopHint);
    //取消窗口最前
    //w.setWindowFlags(w.windowFlags() &~ Qt::WindowStaysOnTopHint);
    w.show();
    return a.exec();
}
  • mainwindow.cpp文件:mainwindow.h中函数的实现。使用QLCDNumber控件去显示时间
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //去掉标题栏
    //this->setWindowFlags(Qt::FramelessWindowHint);

    //设置透明窗体  120号属性
    //this->setAttribute(Qt::WA_TranslucentBackground);

    setWindowTitle("Tomato Clock");
    //setWindowFlags(Qt::FramelessWindowHint);
    isStart = false;     //初始为还未计时
    timer = new QTimer;
    m_secCnt = 0;
    m_minCnt = 0;

    ui->lcdNumber->setDigitCount(5);//显示位数
    ui->lcdNumber->setMode(QLCDNumber::Dec);//设置显示模式为十进制
    ui->lcdNumber->setSegmentStyle(QLCDNumber::Filled);//设置显示外观Outline、Filled、Flat三种
    ui->lcdNumber->display("25:00");
    ui->pbEnd->setEnabled(false);
    connect(timer,SIGNAL(timeout()),this,SLOT(updateTime()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::updateTime(){
    m_secCnt++;
    if(m_secCnt >= 60) {
        m_secCnt = 0;
        m_minCnt++;
    }
    if(m_minCnt >= 25) {
        //disconnect(timer,SIGNAL(timeout()),this,SLOT(updateTime200()));
        ui->pbEnd->setDisabled(true);
        ui->pbStart->setEnabled(true);
        timer->stop();
        m_secCnt = 0;
        m_minCnt = 0;
        isStart = false;
        QMessageBox::information(this,
            tr("温馨提示"),tr("时间到,休息一下吧~"),
            QMessageBox::Ok | QMessageBox::Cancel,
            QMessageBox::Ok);
    }
    QString min = QString::number(24 - m_minCnt);
    QString sec = QString::number(59 - m_secCnt);
    if(min.length() == 1) min = "0" + min;
    if(sec.length() == 1) sec = "0" + sec;
    QString timeToShow = min + ":" + sec;
    ui->lcdNumber->display(timeToShow);
}

void MainWindow::on_pbStart_clicked()
{
    if(!isStart) //尚未开始 开始计时
    {
        timer->start(1000);
        ui->lcdNumber->display("24:59");
        ui->pbStart->setDisabled(true);
        ui->pbEnd->setEnabled(true);
    }
}

void MainWindow::on_pbEnd_clicked()
{
    ui->pbEnd->setDisabled(true);
    ui->pbStart->setEnabled(true);
    timer->stop();
    m_secCnt = 0;
    m_minCnt = 0;
    ui->lcdNumber->display("00:00");
    isStart = false;
}
  • UI设计:界面元素非常简单,两个QPushButton用于控制计时器和一个QLCDNumber用于显示剩余时间。

  •  激动人心的时候到了,跑起来吧

 计时结束后会弹出提示,休息一下吧~