为了方便在电脑上使用番茄钟,自己写了一个简单的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了却好像还在计时?不过最后采用断开槽连接之后确实没问题了。