简单的Qt倒计时程序--番茄钟

为了方便在电脑上使用番茄钟,自己写了一个简单的Qt程序,用到了QLCDNumber显示剩余时间,Timer定时器发射定时信号,QPushbutton开始按钮。

点击开始工作会开始倒计时,为了方便观看加了一个霸道的窗口置顶,切换应用后也永远在顶端显现。
在这里插入图片描述

25分钟结束后倒计时界面变红,再次点击开始工作重新进入倒计时。
在这里插入图片描述

总之,程序相当简单,界面也就只有一个lcd显示屏+一个按钮。主要是为了窗口置顶功能,省了平常还要使用deskpin的麻烦233333.

把代码放上来:只更改了widget.h和widget.cpp文件,main.cpp及.pro文件并未修改。
widget.h

#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>
#include <QDialog>
#include <QLCDNumber>
#include <QVBoxLayout>
#include <QPushButton>




class Widget : public QWidget
{
    Q_OBJECT


public:
    Widget(QWidget *parent = 0);
    ~Widget();
signals:
public slots:
    void onTimeout();
    void clickOnButton();
private:
    QLCDNumber *lcd;
    QTimer *timer;
    int minute=25,second=0;
    QVBoxLayout *layout;
    QPushButton *startbutton;
};


#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include <QtGui>
#include <QLCDNumber>
#include <QTime>
#include <QTimer>
#include <QVBoxLayout>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    lcd=new QLCDNumber();
    lcd->setDigitCount(5);
    lcd->setMode(QLCDNumber::Dec);
    lcd->setSegmentStyle(QLCDNumber::Flat);


    timer=new QTimer();
    timer->setInterval(1000);
    timer->start();


    startbutton=new QPushButton("开始工作");
    connect(startbutton,SIGNAL(clicked(bool)),this,SLOT(clickOnButton()));


    QVBoxLayout *layout = new QVBoxLayout();
    layout->addWidget(lcd);
    layout->addWidget(startbutton);


    this->setLayout(layout);
    this->resize(400,200);
    this->setWindowFlag(Qt::WindowStaysOnTopHint);
    //this->setWindowFlags(Qt::Widget | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowStaysOnTopHint);
}

Widget::~Widget(){}

void Widget::onTimeout(){
    QString s_minute=QString::number(minute);
    QString s_second=QString::number(second);
    if (s_minute.length()==1)   s_minute="0"+s_minute;
    if(s_second.length()==1)    s_second="0"+s_second;
    QString disp=s_minute+":"+s_second;
    lcd->display(disp);
    //QTime time = QTime::currentTime();
    //lcd->display(time.toString("mm:ss"));
    if((minute!=0)|(second!=0)){
        if(second==0){
            second=59;
            minute--;}
        else
            second--;
    }
    else
        lcd->setStyleSheet("background-color:red");
    //lcd->display(QTime::currentTime().toString(QString::number(minute)+":"+QString::number(second)));
}

void Widget::clickOnButton(){
    this->minute=25;
    this->second=0;
    disconnect(timer,SIGNAL(timeout()),this,SLOT(onTimeout()));
    connect(timer,SIGNAL(timeout()),this,SLOT(onTimeout()));
    this->lcd->setStyleSheet("background-color:white");
}

最后一点:
不知道为什么,如果使用timer->stop代替disconnect的话,会莫名进入到加速状态。第一次点击开始按钮,正常倒计时;第二次点击开始,每秒显示的数字其实是减2…;第N次每秒数字减N。没搞明白为什么timer明明stop了却好像还在计时?不过最后采用断开槽连接之后确实没问题了。

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是新年倒计时10-1烟花爱心代码的示例: ```html <!DOCTYPE html> <html> <head> <title>New Year Countdown</title> <style> .countdown { font-size: 48px; text-align: center; margin-top: 200px; } .fireworks { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); pointer-events: none; } .heart { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); pointer-events: none; } </style> </head> <body> <div class="countdown" id="countdown"></div> <canvas class="fireworks" id="fireworks"></canvas> <img class="heart" src="heart.png" width="100" height="100"> <script> // 设置倒计时的结束时间 var countdownDate = new Date("Jan 1, 2023 00:00:00").getTime(); // 更新倒计时 var countdown = setInterval(function() { var now = new Date().getTime(); var distance = countdownDate - now; // 计算剩余时间 var days = Math.floor(distance / (1000 * 60 * 60 * 24)); var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); var seconds = Math.floor((distance % (1000 * 60)) / 1000); // 显示倒计时 document.getElementById("countdown").innerHTML = days + "d " + hours + "h " + minutes + "m " + seconds + "s "; // 倒计时结束时触发烟花和爱心效果 if (distance < 0) { clearInterval(countdown); showFireworks(); showHeart(); } }, 1000); // 显示烟花效果 function showFireworks() { var canvas = document.getElementById("fireworks"); var ctx = canvas.getContext("2d"); var particles = []; var particleCount = 100; canvas.width = window.innerWidth; canvas.height = window.innerHeight; function Particle() { this.x = canvas.width / 2; this.y = canvas.height / 2; this.vx = Math.random() * 10 - 5; this.vy = Math.random() * 10 - 5; this.gravity = 0.1; } Particle.prototype.update = function() { this.x += this.vx; this.y += this.vy; this.vy += this.gravity; } Particle.prototype.draw = function() { ctx.fillStyle = "rgba(" + Math.floor(Math.random() * 256) + "," + Math.floor(Math.random() * 256) + "," + Math.floor(Math.random() * 256) + ",1)"; ctx.beginPath(); ctx.arc(this.x, this.y, 5, 0, Math.PI * 2); ctx.closePath(); ctx.fill(); } function createParticles() { for (var i = 0; i < particleCount; i++) { var particle = new Particle(); particles.push(particle); } } function updateParticles() { for (var i = 0; i < particles.length; i++) { var particle = particles[i]; particle.update(); particle.draw(); if (particle.y > canvas.height) { particles.splice(i, 1); } } } function animate() { ctx.clearRect(0, 0, canvas.width, canvas.height); createParticles(); updateParticles(); requestAnimationFrame(animate); } animate(); } // 显示爱心效果 function showHeart() { var heart = document.querySelector(".heart"); heart.style.display = "block"; } </script> </body> </html> ``` 请注意,上述代码中使用了一个名为"heart.png"的图片作为爱心的图标。你可以将该图片与HTML文件放在同一目录下,并将其文件名替换为你自己的图片文件名。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值