八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); };
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(); }
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实现计时器-从设计到打包运行的主要内容,如果未能解决你的问题,请参考以下文章