八、QT實現計時器-從設計到打包運行(一)


一、由來

   我最近一直有做時間記錄的習慣,就是看自己每天專注程度怎么樣,花了多少時間,但是多次頻繁的打開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);
};
View Code

  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();
}
View Code

  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/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM