八QT实现计时器-从设计到打包运行

Posted fantianliang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八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") << "
";
    }

    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/

 

 

以上是关于八QT实现计时器-从设计到打包运行的主要内容,如果未能解决你的问题,请参考以下文章

九QT实现计时器-从设计到打包运行

九QT实现计时器-从设计到打包运行

QT 如何实现记录运行时间

java怎么实现JSON打包UDP

Python Qt GUI设计:QTimer计时器类QThread多线程类和事件处理类(基础篇—8)

桌面会飞的鸟Qt C++小项目