一、由來
我最近一直有做時間記錄的習慣,就是看自己每天專注程度怎么樣,花了多少時間,但是多次頻繁的打開txt文件然后記錄,很是繁瑣,在手動記錄了幾個月之后,我終於想起來並且有時間去做一個自動記錄的小工具。
我之前手動記錄的時候是這樣的:
我希望可以實現的功能:完成我平時的時間記錄,比如點擊開始,然后點擊暫停,就能夠自動向一個文件里面輸出我在這個時間段做了什么(這個內容需要自己手動填寫),這樣可以避免我自己去手動的記錄這些東西。
二、主要思路
主要是先完成計時器功能,可以記錄時間段的長短,然后能夠把其時間輸出到一個txt文件里面
參考鏈接:https://www.cnblogs.com/dplearning/p/4480017.html
三、平台
使用VS開發QT項目
VS2019
QT5.13.1
四、工程構建
4.1界面設計
先完成這樣的一個ui界面設計:
注意其布局結構為:先是一個verticalLayout,然后包含兩個VerticalLayout布局
最上面的是QLCDNumber
中間兩個是pushbutton
最下面是一個lineEdit,具體的控件可以參考上圖右邊的紅色框內部的說明
4.2程序
新建工程為SimpleTimer。
SimpleTimer.h

//SimpleTimer.h #pragma once #include <QtWidgets/QMainWindow> #include "ui_SimpleTimer.h" #include "qdatetime.h" #include "qtimer.h" #include <QTime> #include "qpixmap.h" #include <qicon.h> #include <QDir> #include <QMessageBox> #include <QTextStream> class SimpleTimer : public QMainWindow { Q_OBJECT public: SimpleTimer(QWidget *parent = Q_NULLPTR); private slots: void updateTime(); void on_start_clicked(); void on_stop_clicked(); private: Ui::SimpleTimerClass ui; QTimer* timer; //定時器,每秒更新時間 QTime* TimeRecord; //記錄時間 QDateTime* TimeWrite; //准備寫如到文件里面的時間 bool isStart; //記錄是否已經開始計時 QIcon* startIcon; //一些圖標 QIcon* pauseIcon; QIcon* stopIcon; void Write(QString write_str); };
SimpleTimer.cpp

#include "SimpleTimer.h" //初始化函數 SimpleTimer::SimpleTimer(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); setWindowIcon(QIcon(":/icon.png")); setWindowTitle("SimpleTimer"); isStart = false; //還沒有開始計時 timer = new QTimer; //視始化定時器 TimeRecord = new QTime(0, 0, 0); //初始化時間 TimeWrite = new QDateTime(); ui.Timer->setDigitCount(8); ui.Timer->setSegmentStyle(QLCDNumber::Flat); ui.Timer->display(TimeRecord->toString("hh:mm:ss")); QPixmap pixStart("icon/start.png"); startIcon = new QIcon(pixStart); QPixmap pixPause("icon/pause.png"); pauseIcon = new QIcon(pixPause); QPixmap pixStop("icon/stop.png"); stopIcon = new QIcon(pixStop); ui.Start->setIconSize(QSize(100, 100)); ui.Start->setIcon(*startIcon); ui.Start->show(); ui.Stop->setIconSize(QSize(100, 100)); ui.Stop->setIcon(*stopIcon); ui.Stop->show(); connect(timer, SIGNAL(timeout()), this, SLOT(updateTime())); connect(ui.Start, SIGNAL(clicked()), this, SLOT(on_start_clicked())); connect(ui.Stop, SIGNAL(clicked()), this, SLOT(on_stop_clicked())); } void SimpleTimer::updateTime() { *TimeRecord = TimeRecord->addSecs(1); ui.Timer->display(TimeRecord->toString("hh:mm:ss")); } void SimpleTimer::on_start_clicked() { if (!isStart) { ui.Start->setIcon(*pauseIcon); ui.Start->show(); timer->start(1000); Write(TimeWrite->currentDateTime().toString("MM-dd hh-mm"));//將開始時間寫入到文件 } else { ui.Start->setIcon(*startIcon); ui.Start->show(); timer->stop(); //Write(TimeWrite->currentDateTime().toString("hh-mm "));//將結束時間寫入到文件 } isStart = !isStart; } void SimpleTimer::on_stop_clicked() { timer->stop(); //計時器停止 Write(TimeWrite->currentDateTime().toString("hh-mm "));//將結束時間寫入到文件 isStart = false; TimeRecord->setHMS(0, 0, 0); //時間復位為0 ui.Timer->display(TimeRecord->toString("hh:mm:ss")); ui.Start->setIcon(*startIcon);//開始按鈕復位 } void SimpleTimer::Write(QString write_str) { QString fileName = "C:\\Users\\tianl\\Desktop\\record.txt"; QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { QMessageBox::warning(this, "sdf", "can't open", QMessageBox::Yes); } QTextStream stream(&file); if(!isStart) stream << write_str+ "-"; else { stream << write_str; stream<<ui.lineEdit->text()<< TimeRecord->toString(" hh-mm") << "\n"; } file.close(); }
main.cpp無修改
4.3運行結果
4.4出現問題
4.4.1當點擊暫停的時候,槽函數響應了兩遍
后來發現問題出現在這里:
我的暫停按鈕設置的為Stop,而QT里面默認控件的槽函數為 on_Stop_clicked()
這個時候已經不需要鏈接槽函數與信號了,但是我又鏈接了一遍,所以導致響應了兩遍。
這里我的解決辦法是:修改為on_stop_clicked(),這樣就不是默認的槽函數了。
4.4.2控件大小無法隨着界面的改變而改變
如下圖:
解決辦法:選取一個頂層Widget,然后設置布局為任意布局
五、工程文件
主要程序文件以及使用的圖標在這里:
https://gitee.com/fantianliang/Timer/tree/master/