QT上位机开发(倒计时软件)

发布时间:2023年12月30日

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

? ? ? ? 倒计时软件是生活中经常遇到的一种场景。比如运动跑步,比如学校考试,比如论文答辩等等,只要有时间限制规定的地方,我们都会遇到倒计时的一些设备。目前在电商网站上面,可以找到很多这类的倒计时工具,不过既然我们学习了QT平台,那么完全可以用它来实现一个简单的倒计时软件。

? ? ? ? 为了简单演示一下,我们设计了AA:BB的形式,其中AA代表分钟,BB代表秒。启动之后,每隔1s,BB会递减1,如果不够,就会从AA借数。等到AA和BB变成00之后,会有一个弹窗弹出来。整个逻辑就是这么一个过程。

1、设计界面

? ? ? ? 界面部分前面也说过,就是使用AA:BB的部分来完成的。所以,为了方便,就直接用qt designer来设计即可,

? ? ? ? 截图上来看,中间显示部分字体偏小。不过没有关系,这部分后期可以通过编码的方法来进行解决。

2、QtWidgetsApplication1.h中添加变量和回调函数

? ? ? ? 所谓变量,主要就是定时器和初始值。而回调函数,则是每次定时器调用的子函数。这部分和之前的按钮回调函数一样,也是槽函数,所以也会多一个关键字slots。此外,我们把字符的更新动作也单独设计成了一个函数display_number。

#pragma once

#include <QtWidgets/QMainWindow>
#include <QTimer>
#include "ui_QtWidgetsApplication1.h"

class QtWidgetsApplication1 : public QMainWindow
{
    Q_OBJECT

public:
    QtWidgetsApplication1(QWidget *parent = nullptr);
    ~QtWidgetsApplication1();

private:
    Ui::QtWidgetsApplication1Class ui;
	QTimer* p_timer;
	int total;
	void display_number();

private slots:
	void update();
};

3、QtWidgetsApplication1.cpp功能实现

? ? ? ? 要实现倒计时的功能,首先肯定要初始化好构造函数。前面我们说过,在类定义里面会添加一些变量,那么在类开始构造的时候,就要初始化这些变量,这就包括了定时器和初始值。另外,因为整体字体比较小,这里也一并处理了一下。

#include <QApplication>
#include <QPushButton>
#include <QMessageBox>
#include "QtWidgetsApplication1.h"

QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

	//set font
	QFont ft;
	ft.setPointSize(20);
	ui.label_1->setFont(ft);
	ui.label_2->setFont(ft);
	ui.label_3->setFont(ft);
	ui.label_4->setFont(ft);
	ui.label_5->setFont(ft);

	// set total value
	total = 1800;

	// set timer
	p_timer = new QTimer(this);
	connect(p_timer, SIGNAL(timeout()), this, SLOT(update()));
	p_timer->start(1000); // 1000 is interval
	display_number();
}

// destructor function
QtWidgetsApplication1::~QtWidgetsApplication1()
{
	if (p_timer)
	{
		delete p_timer;
	}
}

? ? ? ? 如代码所示,这里创建了一个周期为1000ms的定时器,它的回调函数是update,初始值是1800。所以,根据这些信息,我们继续查看定时器的回调函数update,

// timeout callback function
void QtWidgetsApplication1::update()
{
	total -= 1;
	display_number();

	if (total == 0)
	{
		p_timer->stop();
		delete p_timer;
		p_timer = NULL;

		QMessageBox::information(this, "tip", "Timeout!");
	}
}

? ? ? ? 回调函数update的逻辑还是很清晰的,每1s递减1,直到数值为0结束。这个时候,停止定时器、删除定时器、跳出弹框。当然,每次更新数值后,更新数值也是必不可少的,所以这里还有一个display_number的函数。

// shou data here
void QtWidgetsApplication1::display_number()
{
	ui.label_1->setText(QString::number((total / 60) / 10));
	ui.label_2->setText(QString::number((total / 60) % 10));
	ui.label_3->setText(QString::number((total % 60) / 10));
	ui.label_4->setText(QString::number((total % 60) % 10));
}

? ? ? ? display_number的内容比较简单,首先计算分钟的十分位和个位,接着计算秒钟的十分位和个位。最后把这些数值贴到label1、label2、label3、label4上面,这样就达到了数值更新的效果。

4、测试和验证

? ? ? ? 测试的话就比较简单,直接编译后启动即可。首先查看数字是否发生跳变。

????????如果ok,再检验超时之后是否有弹窗,一切都没有问题的话就可以了。反之,就要回头debug,单步调试下,看看问题出在哪。

文章来源:https://blog.csdn.net/feixiaoxing/article/details/135308897
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。